http://acm.hdu.edu.cn/showproblem.php?pid=4460
求任意点对的最短距离的最大值,因为题目数据量大,用floyed 和dijkstra都不行,这里用spfa实现
#include<cstdio>
#include<map>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#define N 1001
#define inf 0x7fffffff
using namespace std;
int dis[N][N],n,vis[N];
vector<int>v[N];
queue<int>q;
map<string,int>mm;
void init()
{
for(int i=0;i<n;i++)
v[i].clear();
for(int i=0;i<n;i++)
{
dis[i][i]=0;
for(int j=i+1;j<n;j++)
dis[i][j]=dis[j][i]=inf;
}
mm.clear();
while(!q.empty()) q.pop();
}
void spfa(int i)
{
vis[i]=1;
dis[i][i]=0;
q.push(i);
while(!q.empty())
{
int t=q.front();
q.pop();
for(int j=0;j<v[t].size();j++)
{
int m=v[t][j];
if(!vis[m])
{
dis[i][m]=dis[i][t]+1;
vis[m]=1;
q.push(m);
}
}
}
}
int main()
{
int m;
string s,a,b;
while(scanf("%d",&n)!=EOF&&n)
{
init();
for(int i=0;i<n;i++)
{
cin>>s;
mm[s]=i;
}
scanf("%d",&m);
while(m--)
{
cin>>a>>b;
int x=mm[a];
int y=mm[b];
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
spfa(i);
}
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
ans=max(ans,dis[i][j]);
}
}
if(ans==inf) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}