题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4460
题意:读题了,不想说了。
思路:挺暴力的方法,对每个点都跑一遍spfa,中间加一个长度限制7的优化,然后再暴力的来判就好。
code:
#include <cstdio>
#include <queue>
#include <cstring>
#include <string>
#include <map>
using namespace std;
const int maxn=1001;
const int inf=0x7ffffff;
int n,m;
char name[11];
queue<int> que;
map <string ,int>mp;
int d[maxn];
int e[maxn][maxn];
int len[maxn];
bool vis[maxn];
int spfa(int s){
while(!que.empty()){que.pop();}
que.push(s);
fill(d,d+n,inf);
d[s]=0;
memset(vis,0,sizeof(vis));
while(!que.empty()){
int tp=que.front();que.pop();
vis[tp]=false;
for(int i=0;i<len[tp];i++){
int t=e[tp][i];
if(d[t]>d[tp]+1){
d[t]=d[tp]+1;
if(d[t]>6)return -1;
if(!vis[t]){
que.push(t);
vis[t]=true;
}
}
}
}
int mast=0;
for(int i=0;i<n;i++){
if(d[i]>6)return -1;
mast=max(mast,d[i]);
}
return mast;
}
void addedge(int f,int t){
e[f][len[f]++]=t;
e[t][len[t]++]=f;
}
int main(){
while(scanf("%d",&n)==1&&n){
memset(len,0,sizeof(len));
mp.clear();
for(int i=0;i<n;i++){
scanf("%s",name);
string str(name);
mp[str]=i;
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%s",name);
string str(name);
int f=mp[name];
scanf("%s",name);
str= string (name);
int t=mp[name];
addedge(f,t);
}
int ans=0;
for(int i=0;i<n;i++){
int fl=spfa(i);
if(fl==-1){ans=-1;break;}
ans=max(ans,fl);
}
printf("%d\n",ans);
}
}