POJ 2531 深搜剪枝
题意:全局最大割。
分析:有相应的算法,数据量很小,可以枚举源点,汇点,最大流。
这里用DFS,状态定义:分成两个集合,刚开始S集合全部点,然后一个一个放,这是一个回溯的过程。
没剪枝也过了。
剪枝技巧:当前这个节点放到T集合,比之前还小,那么一定,这个点不在T集合里面。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 6 using namespace std; 7 8 const int maxn = 20 + 5; 9 int n; 10 int a[maxn][maxn]; 11 int dep[maxn]; 12 13 int ans; 14 15 16 void dfs(int u,int m) { 17 dep[u] = 1; 18 int tmp = m; 19 20 for(int i=0;i<n;i++) { 21 if(dep[i]==0) 22 m+=a[i][u]; 23 else m-=a[i][u]; 24 } 25 26 if(m>ans) 27 ans = m; 28 29 for(int i=u+1;i<n;i++) { 30 if(m > tmp) { 31 dfs(i,m); 32 dep[i] = 0; 33 } 34 } 35 } 36 37 int main() 38 { 39 scanf("%d",&n); 40 41 for(int i=0;i<n;i++) { 42 for(int j=0;j<n;j++) { 43 scanf("%d",&a[i][j]); 44 } 45 } 46 47 memset(dep,0,sizeof(dep)); 48 49 ans = 0; 50 dfs(0,0); 51 printf("%d\n",ans); 52 53 return 0; 54 }