POJ 2531 Network Saboteur [暴搜]

题意:

给定一个图,矩阵表示边权值。

问怎样分配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;
}


你可能感兴趣的:(优化,NetWork)