Network Saboteur POJ - 2531

原题链接

考察:dfs

不看算法标签完全看不出是dfs系列

思路:

        枚举每一个点选与不选的集合.依次考虑几个剪枝:

  1. 搜索顺序剪枝,可能要按点权值和排序?,这样写挺麻烦的= =
  2. 最优性剪枝,这里本蒟蒻不知道怎么剪,可能存在选d较小,选c较大,但是选d a是ans的情况.
  3. 可行性剪枝,如果算出来加入这个点的成本<=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 }

 

posted @ 2021-03-10 09:18  acmloser  阅读(59)  评论(0编辑  收藏  举报