#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=27;
int in[maxn],out[maxn],fa[maxn],u,v,flag[maxn];
char s[1005];
void init()
{
fill(in,in+maxn,0);
fill(out,out+maxn,0);
fill(flag,flag+maxn,0);
for(int i=0;i<maxn;i++)
fa[i]=i;
}
int find(int i)
{
if(i==fa[i])
return i;
return fa[i]=find(fa[i]);
}
void union_set(int u,int v)
{
int fu=find(u),fv=find(v);
if(fu==fv)
return;
fa[fu]=fv;//写错了wa到吐血都找不出错误=_=
}
int main()
{
int t,n,i,cnt,st,ed;
scanf("%d",&t);
while(t--&&scanf("%d",&n)!=EOF)
{
init();
while(n--&&scanf("%s",s)!=EOF)
{
u=s[0]-'a';
v=s[strlen(s)-1]-'a';
in[v]++;
out[u]++;
flag[u]=flag[v]=1;
union_set(u,v);
}
for(i=cnt=st=ed=0;i<maxn;i++)
if(flag[i]&&fa[i]==i)
cnt++;
if(cnt>1)
{
printf("The door cannot be opened.\n");
continue;
}
for(i=0;i<maxn;i++)
{
if(!flag[i]||in[i]==out[i]) continue;
if(in[i]==out[i]+1)
ed++;
else if(in[i]+1==out[i])
st++;
else
break;
}
if(i<maxn)
printf("The door cannot be opened.\n");
else if(st+ed==0||st==1&&ed==1)
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
poj 1386 欧拉回路
最新推荐文章于 2021-05-14 23:51:02 发布