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 }