简单BFS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 1005;
int n , ans , e , m;
int head[maxn] , vis[maxn];
bool flag;
struct T{
int u , v , next;
}edge[maxn * 40];
struct TT{
char name[100];
}s[maxn];
struct TTT{
int id;
int len;
};
void init(){
e = 0;
memset(head , -1 , sizeof(head));
}
void addedge(int u ,int v){
edge[e].u = u;
edge[e].v = v;
edge[e].next = head[u];
head[u] = e ++;
}
int bs(int l , int r , char *t){
int m = (l + r) / 2;
while(l <= r){
m = (l + r) / 2;
if(strcmp(s[m].name , t) == 0) break;
else if(strcmp(s[m].name , t) > 0) r = m - 1;
else l = m + 1;
}
return m;
}
bool cmp(TT a , TT b){
if(strcmp(a.name , b.name) < 0) return true;
return false;
}
queue<TTT> q;
int bfs(int src){
int tot = 0;
int ret = -1;
TTT now , temp;
memset(vis , 0 , sizeof(vis));
while(!q.empty()) q.pop();
now.len = 0;
now.id = src;
vis[now.id] = 1;
tot ++;
q.push(now);
while(!q.empty()){
now = q.front();
if(ret < now.len) ret = now.len;
int u = now.id;
q.pop();
for(int i = head[u] ; i != -1 ; i = edge[i].next){
int v = edge[i].v;//printf("v = %d\n" , v);
if(vis[v] == 0){
temp.id = v;
temp.len = now.len + 1;
vis[v] = 1;
tot ++;
q.push(temp);
}
}
}
if(tot != n) flag = true;
return ret;
}
int main(){
char t1[maxn] , t2[maxn];
int id1 , id2 , ans;
while(~scanf("%d" , &n) && n){
init();
ans = -1;
for(int i = 0 ; i < n ; i ++){
scanf("%s" , s[i].name);
}
scanf("%d" , &m);
sort(s , s + n , cmp);
for(int i = 0 ; i < m ; i ++){
scanf("%s%s" , t1 , t2);
id1 = bs(0 , n , t1);
id2 = bs(0 , n , t2);
addedge(id1 , id2);
addedge(id2 , id1);
}
flag = false;
for(int i = 0 ; i < n ; i ++){
//printf("i = %d\n" , i);
int temp = bfs(i);
if(flag == true) break;
if(ans < temp) ans = temp;
}
if(flag == true) printf("-1\n");
else printf("%d\n" , ans);
}
return 0;
}