欧拉回路+并查集(判断图是否连通,被这坑了。。)
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<stack>
#include<vector>
#include<queue>
#include<map>
using namespace std;
int p[30];
int find(int x){
return x==p[x]?x:(p[x]=find(p[x]));
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int t;
cin>>t;
while(t--){
int n,out[30],in[30],cnt=0,flag=false,c1=0,c2=0,c3=0;
bool vis[30];
fill(vis,vis+30,false);
fill(out,out+30,0);
fill(in,in+30,0);
for(int i=0;i<30;i++) p[i]=i;
cin>>n;
int tn=n;
while(n--){
string word;
cin>>word;
int x=word[0]-'a';
in[x]++;
vis[x]=true;
int y=word[word.size()-1]-'a';
out[y]++;
vis[y]=true;
int tx=find(x),ty=find(y);
p[tx]=p[ty];
}
for(int i=0;i<30;i++){
if(vis[i]) c3++;
if(abs(in[i]-out[i])==1) c1++;
else if(vis[i]&&out[i]==in[i]) c2++;
}
for(int i=0;i<30;i++)
if(vis[i]&&find(i)==i)
cnt++;
if(cnt>1){
puts("The door cannot be opened.");
continue;
}
if((c2==c3)||(c1==2&&c2==c3-2)) puts("Ordering is possible.");
else puts("The door cannot be opened.");
}
return 0;
}