#include<bits/stdc++.h>
using namespace std;
int edege[26][26],out[26],in[26],tag[26];
void dfs(int u)
{
tag[u] = 1;
for(int i =0;i<26;i++)
{
if(edege[u][i]&&tag[i]==0) dfs(i);
}
}
int main()
{
string s;
int t,n,len;scanf("%d",&t);
while(t--)
{
memset(edege,0,sizeof(edege));
memset(out,0,sizeof(out));
memset(in,0,sizeof(in));
scanf("%d",&n);
int a=0,b=0,flag=1;
for(int i = 0;i < n;i++)
{
cin>>s;
len = s.length();
edege[s[0]-'a'][s[len-1]-'a']++;
out[s[0]-'a']++;in[s[len-1]-'a']++;
}
for(int i = 0;i<26;i++)
{
if(out[i]!=in[i])
{
if(out[i]-in[i]==1) a++;
else if(in[i]-out[i]==1) b++;
else {flag = 0;break;}
}
}
if(a&&b&&a+b>2) flag = 0;
if(flag)
{
memset(tag,0,sizeof(tag));
int ok = 1;
if(a+b==2)
{
for(int i = 0;i<26;i++)
{
if(out[i]&&1==(out[i]-in[i]))
{
dfs(i);break;
}
}
}
else
for(int i = 0;i<26;i++)
{
if(out[i]) {dfs(i);break;}
}
for(int i = 0;i<26;i++)
{
if(out[i]&&!tag[i]) {ok = 0;break;}
if(in[i]&&!tag[i]) {ok = 0;break;}
}
if(ok) printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}
else printf("The door cannot be opened.\n");
}
return 0;
}
HDU1116(有向图欧拉路判断
最新推荐文章于 2020-08-25 23:07:04 发布