标签:
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu
Description
Input
Output
Sample Input
3 0 50 30 50 0 40 30 40 0
Sample Output
90
解题思路:题目大意:给定一个邻接矩阵,要求将顶点分为A,B两个集合,使得A集合中的所有顶点到B集合所有顶点的距离之和为最大。
首先两个集合的表示用一个一维数组A[],其中A[i]=1,表示节点i在集合A中,为0则在集合B中。
二位数组C[][]存储邻接矩阵,
由于每一个数字有两种选择0和1,结构适用深度优先:从第一个数开始A[0]=1(假设0号顶点一定在集合A中),
对0来说第2个顶点有两种情况,依次类推,结构就出来了。递归出口就是到达第n-1号顶点。
求和用两个for循环加上对存在集合的判定,记录最大值,每次求和结果与最大值比较,如果更大则修改最大值。
收获感想:对深度优先有了更深刻的理解,刚开始编写的时候思路有点混乱,不知道怎么写递归,出口也搞错了,一遍遍的过程中深入理解。
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; int A[21],B[21],C[21][21],N,sum,tp=0,tp2=0; void bfs(int tp,int l); int main() { memset(A,0,21); //memset(B,-1,21); while(scanf("%d",&N)!=EOF){ for(int i=0;i<N;i++) for(int j=0;j<N;j++) scanf("%d",&C[i][j]); bfs(0,1); printf("%d\n",sum); } return 0; } void bfs(int tp,int l) { if(tp==N||tp==-1) return; int s=0; A[tp]=l; for(int i=0;i<N;i++) { if(A[i]==1) for(int j=0;j<N;j++) { if(A[j]==0) s=s+C[i][j]; } } if(sum<s) sum=s; bfs(tp+1,1); bfs(tp+1,0); }
CSU-ACM2016暑假集训训练2-DFS(C - Network Saboteur)
标签:
原文地址:http://www.cnblogs.com/hr974041087/p/5697528.html