思路:任意点对之间的最短路
#include<bits/stdc++.h>
using namespace std;
const int maxn =1005;
#define INF 1e9
vector<int>e[maxn];
int d[maxn][maxn];
map<string,int>mp;
int vis[maxn];
void spfa(int x)
{
memset(vis,0,sizeof(vis));
d[x][x]=0;
queue<int>q;
vis[x]=1;
q.push(x);
while(!q.empty())
{
int u = q.front();
q.pop();
//vis[u]=0;
for(int i = 0;i<e[u].size();i++)
{
int v = e[u][i];
if(!vis[v])
{
d[x][v]=d[x][u]+1;
q.push(v);
vis[v]=1;
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF && n)
{
mp.clear();
for(int i = 0;i<=n;i++)
e[i].clear();
int cnt = 1;
for(int i = 1;i<=n;i++)
{
string temp;
cin >> temp;
mp[temp]=cnt++;
}
int m;
for(int i = 1;i<=n;i++)
{
d[i][i]=0;
for(int j = i+1;j<=n;j++)
d[i][j]=d[j][i]=INF;
}
scanf("%d",&m);
for(int i = 0;i<m;i++)
{
string s1,s2;
cin >> s1 >> s2;
e[mp[s1]].push_back(mp[s2]);
e[mp[s2]].push_back(mp[s1]);
}
for(int i = 1;i<=n;i++)
spfa(i);
int ans = 0;
for(int i = 1;i<=n;i++)
for(int j = i+1;j<=n;j++)
ans = max(ans,d[i][j]);
if(ans==INF)
ans=-1;
printf("%d\n",ans);
}
}