您的位置:首页 > 其它

poj 2531 dfs(最大割)

2015-11-06 21:23 375 查看
题意:裸的最大割问题,图按照邻接矩阵给出,定点数小于等于20.

思路:最大割是NP难的,这里用搜索的方法做。有一个小剪枝,就是先算出所有点临边的权值之和。搜索的时候加上后面所有点的权值之和如果大于求出的最大割才继续搜。

#include <cstdio>
#include <cstring>
#include <set>
#include <cmath>
using namespace std;
#define clr(s,t) memset(s,t,sizeof(s))
#define N 1005
int n;
int g[22][22],d[22],flag[22],res;
void dfs(int x,int now){
int j,k;
if(x == n+1){
res = max(res,now);
return ;
}
j = k = 0;
for(int i = 1;i<x;i++){
if(flag[i])
j += g[i][x];
else
k += g[i][x];
}
if(now + j + d[x+1] > res){
flag[x] = 0;
dfs(x+1, now+j);
}
if(now + k + d[x+1] > res){
flag[x] = 1;
dfs(x+1, now+k);
}
}
int main(){
while(scanf("%d",&n)!=EOF){
int i,j;
res = 0;
for(i = 1,d[i] = 0;i<=n;i++)
for(j = 1;j<=n;j++){
scanf("%d",&g[i][j]);
d[i] += g[i][j];
}
for(i = n-1;i>=1;i--)
d[i] += d[i+1];
d[n+1] = 0;
flag[1] = 0;
dfs(2,0);
printf("%d\n",res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: