题意:
给定一个图,矩阵表示边权值。
问怎样分配N个点进两个集合,可以使这个集合之间的边的权值和 最大。
思路:
因为N<=20。所以直接dfs暴搜,这样时间复杂度是O(N*2^N)。
无需任何优化,直接173MS AC掉。
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cmath>
#include<algorithm>
#define llong long long
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
int n,m;
const int N=25;
const int inf=99999999;
int a[N][N];
int ans;
int w[N];
void dfs(int now,int s)
{
int sum[3]={0};//sum[1]代表点now和集合1的边权和,sum[2]则代表和集合2的。
for(int i=1;i<now;i++)
{
sum[w[i]]+=a[now][i];
}
if(now==n)
{
ans=Max(ans,s+sum[1]);
ans=Max(ans,s+sum[2]);
return ;
}
w[now]=2;//将点now加入集合2.
dfs(now+1,s+sum[1]);
w[now]=1;
dfs(now+1,s+sum[2]);
}
void solve()
{
dfs(1,0);
printf("%d\n",ans);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",a[i]+j);
solve();
return 0;
}