最有的答案肯定是找到一些点的集合,这些点两两之间是朋友关系。
考虑到n,m比较小,这样的集合最多只有14个点,暴力找点的集合
先找出1 个点的集合,有n个这样的集合
然后找出2个点的集合,找的时候要求编号比之前的大,这样就能保证不重不漏
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
typedef long long ll;
using namespace std;
struct node
{
int tot;
vector<int> p[11111];
}ji[16];
int n,m;
int Map[110][110];
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(Map,0,sizeof(Map));
for(int i=0;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Map[x][y] = Map[y][x] = z;
}
for(int i=0;i<16;i++)
{
for(int j=0;j<10010;j++)
ji[i].p[j].clear();
ji[i].tot = 0;
}
for(int i=1;i<=n;i++)
ji[0].p[i-1].push_back(i);
ji[0].tot = n;
int Max = 0;
for(int i = 0;i<min(n,14);i++)
{
int len = ji[i].tot;
for(int j = 0;j < len;j++)
{
int ss = ji[i].p[j].size();
int now = ji[i].p[j][ss-1];
for(int k = now+1;k <= n;k ++ )
{
int flag = 1;
for(int s = 0;s < ss;s++)
if(Map[k][ ji[i].p[j][s] ] ==0)
flag = 0;
if(flag)
{
int Sum = 0;
for(int s = 0;s<ss;s++)
ji[i+1].p[ji[i+1].tot].push_back( ji[i].p[j][s]);
ji[i+1].p[ji[i+1].tot].push_back(k);
int L = ji[i+1].p[ji[i+1].tot].size();
for(int ii = 0;ii<L;ii++)
{
int Min = 9999999;
for(int jj=0;jj<L;jj++)
if(ii!=jj)
Min = min(Min,Map[ji[i+1].p[ji[i+1].tot][ii]][ji[i+1].p[ji[i+1].tot][jj]]);
Sum +=Min;
}
Max = max(Max,Sum);
ji[i+1].tot++;
}
}
}
}
// for(int i=0;i<3;i++)
// cout<<ji[i].tot<<endl;
printf("%d\n",Max);
}
return 0;
}
DFS写法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
typedef long long ll;
using namespace std;
int Map[111][110];
int s[111];
int cur ;
int n,m;
int Max= 0;
int dfs(int st,int cur)
{
if(cur>=2)
{
int sum = 0;
for(int i=1;i<=cur;i++)
{
int Min = 99999999;
for(int j=1;j<=cur;j++)
if(i!=j)
Min = min(Min,Map[s[i]][s[j]]);
sum+=Min;
}
Max = max(sum,Max);
}
for(int i = st+1;i <= n;i++)
{
int ok = 1;
for(int j = 1;j<=cur;j++)
{
if(Map[i][s[j]]==0)
ok = 0;
}
if(ok)
{
s[cur+1] = i;
dfs(i,cur+1);
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Map[x][y] = Map[y][x] = z;
}
Max = 0;
dfs(0,0);
printf("%d\n",Max);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013588639/article/details/48003703