poj1386单词连接(欧拉欧拉欧拉)

///单词连接,欧拉回路通路都可以(有向图)
///主要构图:比如possibilities就构造p->s的边
////题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全部连通。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int N=26; char s[1003]; int f[28],outd[28],ind[28]; int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } int main(){ int t; scanf("%d",&t); while(t--){ int n; for(int i=0;i<N;i++) f[i]=i; memset(outd,0,sizeof(outd)); memset(ind,0,sizeof(ind)); scanf("%d",&n); while(n--){ scanf("%s",s); int u=s[0]-'a'; int v=s[strlen(s)-1]-'a'; ///u-->v int a=find(u); int b=find(v); if(a!=b) f[a]=b; outd[u]++; ind[v]++; } int flag=0,sum=0; int sum_in=0,sum_out=0; for(int i=0;i<N;i++){ if(f[i]==i&&(outd[i]+ind[i])>0) sum++; if(outd[i]!=ind[i]){ if(outd[i]+1==ind[i]) sum_in++; else if(outd[i]-1==ind[i]) sum_out++; else flag=1; } } if(!flag&&sum==1&&(sum_out==0&&sum_in==0||sum_in==1&&sum_out==1)) puts("Ordering is possible."); else puts("The door cannot be opened."); } return 0; }

 

posted @ 2019-04-15 22:18  starve_to_death  阅读(133)  评论(0编辑  收藏  举报