题目链接:http://poj.org/problem?id=2531
最大割,不过由于数据范围很小,直接DFS子集生成就可以了。
分成两个子集A和B,一开始所有的点都在A集合里面,DFS决策每一个点是继续留在A集合还是移动到B集合里面去。继续留在A里面的话对现有的代价总和没有影响,移动到集合B的话就让现有的总和加上该点与集合A中其它所有点的边,同时减去该点与集合B中所有其它点的边。
#include <iostream>
#include <cstdio>
using namespace std;
int a[25][25];
bool f[25];
int Max[25];
int n;
int ans;
void dfs(int deep, int now)
{
if (deep == n)
{
ans = max(ans, now);
return ;
}
dfs(deep+1,now);
f[deep] = true;
for (int i=0; i<n; i++)
if (i != deep)
{
if (f[i])
now -= a[deep][i];
else
now += a[deep][i];
}
dfs(deep+1,now);
f[deep] = false;
}
int main()
{
cin>>n;
for (int i=0; i<n; i++)
for (int j=0; j<n; j++) cin>>a[i][j];
dfs(0,0);
cout<<ans<<endl;
return 0;
}