题意:
给n个单词,问是否可以将他们排成一排,使得前一个单词的末字符和后一个单词的首字符相同。
分析:
把每个单词看成一条边,转化为有向图是否存在欧拉路径问题。
代码:
//poj 1386 //sep9 #include <iostream> #include <vector> #include <algorithm> #include <map> #include <string> using namespace std; const int maxN=30; int f[maxN]; int in[maxN],out[maxN]; char name[1024]; int find(int u) { return f[u]==u?u:f[u]=find(f[u]); } bool solve() { int i,j,origin=-1,end=-1,start=-1; for(i=0;i<26;++i) if(in[i]>0||out[i]>0){ if(origin==-1) origin=i; if(find(i)!=find(origin)) return false; if(in[i]==out[i]) continue; if(in[i]==out[i]+1&&end==-1){ end=i; continue; } if(in[i]+1==out[i]&&start==-1){ start=i; continue; } return false; } if(start==-1&&end==-1) return true; else if(start!=-1&&end!=-1) return true; else return false; } int main() { int i,j,x,y,z,cases,n; scanf("%d",&cases); while(cases--){ scanf("%d",&n); memset(out,0,sizeof(out)); memset(in,0,sizeof(in)); for(i=0;i<26;++i) f[i]=i; for(i=1;i<=n;++i){ scanf("%s",name); int len=strlen(name); int x=name[0]-'a'; int y=name[len-1]-'a'; int px=find(x); int py=find(y); if(px!=py) f[px]=py; ++out[x]; ++in[y]; } if(solve()==false) printf("The door cannot be opened.\n"); else printf("Ordering is possible.\n"); } return 0; }
时间: 2024-11-03 01:41:56