poj 2531 dfs(最大割)
2015-11-06 21:23
375 查看
题意:裸的最大割问题,图按照邻接矩阵给出,定点数小于等于20.
思路:最大割是NP难的,这里用搜索的方法做。有一个小剪枝,就是先算出所有点临边的权值之和。搜索的时候加上后面所有点的权值之和如果大于求出的最大割才继续搜。
思路:最大割是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; }
相关文章推荐
- 升级Win10注意事项个人总结
- Hive中JOIN操作
- POJ 1236——Network of Schools——————【加边形成强连通图】
- Linux IPC实践--System V消息队列(3)
- C语言中变量定义的位置(C89和C99的区别)
- excel自动转换为可印刷版式:目录的自动生成
- nio编程与io编程
- BLE中Profile是什么意思?
- supervise进程监控工具
- Android进阶之使用自定义的字体库
- 机器学习之python基础(四)
- 2015年360公司面试
- Python:简单的文件操作
- 我要砍价-自动砍价-思路
- 在SecureCRT下使用sz下载和rz上传文件
- 使用Jstl异常:org.apache.jasper.JasperException: This absolute uri
- 约瑟夫问题(猴子选大王)
- C#访问剪切板
- Java泛型type体系
- Java泛型type体系