【BFS】hdu 4460 Friend Chains
作者:互联网
题目描述:
http://acm.hdu.edu.cn/showproblem.php?pid=4460
中文大意:
人与人之间存在着关系网,例如 A 认识 B,B 认识 C,那么 A 就可以通过 B 联系到 C。
根据关系网,我们可以计算出两个人之间的最短联系距离。
要求:找出最短联系距离中的最大值 k,如果一群人中存在着不能相互联系的两个人,则输出“-1”。
思路:
分别以每个人为起点进行广搜,计算出这个人与其他人的最短联系距离。k 为其中的最大值。
注意:在处理完用户输入的一组数据后,要及时清空或者及时声明新的存储空间,例如 vector<int> g。
代码:
#include<bits/stdc++.h> using namespace std; int n, k, flag; vector<int> g[1000]; void bfs(int index){ //存在不能相互联系的人 if(flag == 1){ return; } bool* visited = new bool[n](); visited[index] = true; int result = 0; queue<int> q; q.push(index); q.push(0); //关系网上朋友的数量 int num = 1; while(!q.empty()){ index = q.front(); q.pop(); int dis = q.front(); q.pop(); result = max(dis, result); for(int i=0;i<g[index].size();i++){ int next = g[index][i]; if(!visited[next]){ visited[next] = true; q.push(next); q.push(dis + 1); num++; } } } if(num != n){ flag = 1; } else{ k = max(k, result); } } int main(){ while(scanf("%d", &n) && n){ memset(g,0,sizeof(g)); map<string, int> mp; string str1,str2; for(int i=0;i<n;i++){ cin>>str1; mp[str1] = i; } int m; scanf("%d", &m); for(int i=0;i<m;i++){ cin>>str1>>str2; g[mp[str1]].push_back(mp[str2]); g[mp[str2]].push_back(mp[str1]); } k = 0; flag = 0; for(int i=0;i<n;i++){ bfs(i); } if(flag){ printf("-1\n"); } else{ printf("%d\n", k); } } }
标签:index,hdu,int,str2,str1,BFS,mp,push,Chains 来源: https://www.cnblogs.com/bjxqmy/p/14350863.html