Network Saboteur POJ - 2531
考察:dfs
不看算法标签完全看不出是dfs系列
思路:
枚举每一个点选与不选的集合.依次考虑几个剪枝:
- 搜索顺序剪枝,可能要按点权值和排序?,这样写挺麻烦的= =
- 最优性剪枝,这里本蒟蒻不知道怎么剪,可能存在选d较小,选c较大,但是选d a是ans的情况.
- 可行性剪枝,如果算出来加入这个点的成本<=0,那就没必要加入.
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int N = 25; 6 int n,mp[N][N],ans; 7 int lowbit(int x) 8 { 9 return x&-x; 10 } 11 int GetCost(int st,int x) 12 { 13 int sum = 0; 14 for(int i=0;i<n;i++) 15 if(st>>i&1) sum-=mp[i][x]; 16 else sum+=mp[x][i]; 17 return sum; 18 } 19 void dfs(int st,int now,int cost) 20 { 21 if(cost>ans) ans = cost; 22 for(int i=st;i<n;i++) 23 { 24 int sum = GetCost(now,i); 25 if(sum>0) dfs(i+1,now+(1<<i),cost+sum); 26 } 27 } 28 int main() 29 { 30 scanf("%d",&n); 31 for(int i=0;i<n;i++) 32 for(int j=0;j<n;j++) 33 scanf("%d",&mp[i][j]); 34 dfs(0,0,0); 35 printf("%d\n",ans); 36 return 0; 37 }