hdu4460

来源:互联网 发布:电信4g网络好用吗 编辑:程序博客网 时间:2024/05/21 10:44
/*
分析:
    2012亚洲杭州站H题。
    水题-、-,字典树+松弛,暴力过了。用了字典树,不过据
说更暴力的、不用字典树的,也能ac-、-III


                                                  2011-11-08
*/












#include"stdio.h"#include"string.h"#include"stdlib.h"#include"queue"using namespace std;#define N 1011#define M 10011int n;int dis[N];struct Eage{int from,to;int next;}eage[2*M];int tot,head[N];void add(int a,int b){eage[tot].from=a;eage[tot].to=b;eage[tot].next=head[a];head[a]=tot++;}struct dictree{struct dictree *child[52];int flag;};struct dictree *root;void insert(char str[],int k){struct dictree *now,*next;int i,l,temp;now=root;for(i=0;str[i];i++){if(str[i]>='a')temp=str[i]-'a';elsetemp=str[i]-'A'+26;if(now->child[temp]!=NULL)now=now->child[temp];else{next=(struct dictree *)malloc(sizeof(struct dictree));for(l=0;l<52;l++)next->child[l]=NULL;next->flag=-1;now->child[temp]=next;now=next;}}now->flag=k;}int find(char str[]){struct dictree *now;int i,temp;now=root;for(i=0;str[i];i++){if(str[i]>='a')temp=str[i]-'a';elsetemp=str[i]-'A'+26;if(now->child[temp]!=NULL)now=now->child[temp];elsereturn -1;}return now->flag;}void build(){int m;int i,l;char str[111],str2[111];int f1,f2;root=(struct dictree *)malloc(sizeof(struct dictree));for(l=0;l<52;l++)root->child[l]=NULL;root->flag=-1;for(i=0;i<n;i++){scanf("%s",str);insert(str,i);}tot=0;memset(head,-1,sizeof(head));scanf("%d",&m);while(m--){scanf("%s%s",str,str2);f1=find(str);f2=find(str2);add(f1,f2);add(f2,f1);}}void getdis(int s){queue<int>q;int hash[N];int j,v;int now,next;memset(dis,-1,sizeof(dis));memset(hash,0,sizeof(hash));dis[s]=0;hash[s]=1;q.push(s);while(!q.empty()){now=q.front();q.pop();for(j=head[now];j!=-1;j=eage[j].next){v=eage[j].to;if(hash[v])continue;hash[v]=1;next=v;dis[next]=dis[now]+1;q.push(next);}}}void solve(){int i,l;int ans=0;for(i=0;i<n;i++){getdis(i);for(l=0;l<n;l++){if(dis[l]==-1){ans=-1;break;}ans=ans>dis[l]?ans:dis[l];}if(ans==-1)break;}printf("%d\n",ans);}int main(){while(scanf("%d",&n),n){build();solve();}return 0;}


原创粉丝点击