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
",ans);
52 
53     return 0;
54 }
View Code
原文地址:https://www.cnblogs.com/TreeDream/p/7207894.html