3 XXX YYY ZZZ 2 XXX YYY YYY ZZZ 0
2
/* 题意:给出一个无向图,若联通则输出任意一对点之间最短路径中的最大值, 若有孤立一点,则输出-1。 */ #include <iostream> #include<cstdio> #include<queue> #include<map> #include<vector> using namespace std; const int inf=10000; int n,m,maxn; map<string,int> mp; vector<int> s[1005]; int dis[1005]; bool vis[1005]; void spfa(int st) { for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0; queue<int> Q; Q.push(st); vis[st]=1; dis[st]=0; while(!Q.empty()) { int u=Q.front(); vis[u]=0; Q.pop(); for(int i=0;i<s[u].size();i++) { if (dis[s[u][i]]<=dis[u]+1) continue; dis[s[u][i]]=dis[u]+1; maxn=dis[s[u][i]]>maxn?dis[s[u][i]]:maxn; if (!vis[s[u][i]]) { vis[s[u][i]]=1; Q.push(s[u][i]); } } } return; } int main() { while(scanf("%d",&n) && n) { for(int i=1;i<=n;i++) { char ch[15]; scanf("%s",&ch); mp[ch]=i; s[i].clear(); } scanf("%d",&m); for(int i=1;i<=m;i++) { char ch1[15],ch2[15]; scanf("%s %s",&ch1,&ch2); s[mp[ch1]].push_back(mp[ch2]); s[mp[ch2]].push_back(mp[ch1]); } int ans=0; for(int i=1;i<=n;i++) { maxn=0; spfa(i); if (maxn==0) ans=-1;//本来想直接退出,输出-1,但是考虑到现在以i为起点的最短路径计算出来的并不一定是最长的长度,可能是最短路径中的一个中间点 if (ans>=0 && maxn>ans) ans=maxn; } printf("%d\n",ans); } return 0; }
HDU 4460 Friend Chains(map + spfa)
原文:http://www.cnblogs.com/stepping/p/5744762.html