poj2531 Network Saboteur DFS枚举剪枝

http://poj.org/problem?id=2531

刚开始题意理解错了,看题解也没看懂。

The traffic data are given in the form of matrix C, where Cij is the amount of data sent between ith and jth nodes (Cij = Cji, Cii = 0). 

这句话很关键。

题意:给你N个节点,把这N个节点放入A、B两个集合,使得距离最大。计算方法:对于A的每一个节点,与B的距离。求此最大值。

注意:题目给的矩阵,第ij表示第i个节点和第j个节点的距离。刚开始以为矩阵是节点,好菜!!!

思路:首先假设所有所有节点都在集合0,然后依次枚举每个节点在集合1,不断更新取最大值,注意剪枝条件:当前的值<已经的得到的最大值。

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int dep[25],a[25][25];
 7 int n,ans;
 8 void dfs(int id,int z)
 9 {
10     dep[id]=1;              //将此节点放于B 
11     int temp=z;
12     for(int i=1;i<=n;i++)
13     {
14         if(dep[i]==0)
15         temp+=a[i][id];       
16         else
17         temp-=a[i][id];     //将此节点从A移到B 
18     }
19     if(ans<temp)      //记录最大值 
20     ans=temp;
21     for(int i=id+1;i<=n;i++)
22     {
23         if(z<temp)   //剪枝,当前值小于已经取得的最大值 
24         {
25             dfs(i,temp);
26             dep[i]=0;     //回溯 
27         }
28     }
29 }
30 main()
31 {
32     while(~scanf("%d",&n))
33     {
34         for(int i=1;i<=n;i++)
35         for(int j=1;j<=n;j++)
36         scanf("%d",&a[i][j]);
37         ans=0;
38         memset(dep,0,sizeof(dep));
39         dfs(1,0);
40         printf("%d\n",ans);
41     }
42 }

 

posted @ 2016-08-02 17:13  Crazy、baby  阅读(308)  评论(0编辑  收藏  举报