题目描述:
http://acm.hdu.edu.cn/showproblem.php?pid=4460
中文大意:
人与人之间存在着关系网,例如 A 认识 B,B 认识 C,那么 A 就可以通过 B 联系到 C。
根据关系网,我们可以计算出两个人之间的最短联系距离。
要求:找出最短联系距离中的最大值 k,如果一群人中存在着不能相互联系的两个人,则输出“-1”。
思路:
分别以每个人为起点进行广搜,计算出这个人与其他人的最短联系距离。k 为其中的最大值。
注意:在处理完用户输入的一组数据后,要及时清空或者及时声明新的存储空间,例如 memset(...)。
代码:
#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
");
}
else{
printf("%d
", k);
}
}
}