思路:判欧拉回路 一个是对应无向图连通 用DFS 继续判 入度 不等于出度的点 不符合2个以内 2个其中一个入度大于出度1,另一个出度大于入度1
#include<bits/stdc++.h>
using namespace std;
char s[1005];
int vis[26];
int mp[27][27];
int indgree[26],outdgree[26];
void dfs(int x){
vis[x]=1;
for(int i=0;i<26;i++)
if(mp[x][i]&&vis[i]!=1){
dfs(i);
}
}
int main(){
int t;
cin>>t;
while(t--){
bool ok=1;
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
memset(indgree,0,sizeof(indgree));
memset(outdgree,0,sizeof(outdgree));
int n;
cin>>n;
int c; //用来DFS
for(int i=0;i<n;i++){
cin>>s;
int temp=strlen(s);
c=s[0]-'a';
vis[s[0]-'a']=vis[s[temp-1]-'a']=-1;
outdgree[s[0]-'a']++;
indgree[s[temp-1]-'a']++;
mp[s[0]-'a'][s[temp-1]-'a']++;
mp[s[temp-1]-'a'][s[0]-'a']++; //底图连通
}
dfs(c);
for(int i=0;i<26;i++){
if(vis[i]==-1)ok=0;
}
if(!ok){cout<<"The door cannot be opened.\n";continue;}
int cnt1=0,cnt2=0;
for(int i=0;i<26;i++){
if(!ok)break;
indgree[i]-=outdgree[i];
if(indgree[i]!=0){
if(indgree[i]==1){
cnt1++;
}
else if(indgree[i]==-1){
cnt2++;
}
else ok=0;
}
if(cnt1>1||cnt2>1){
ok=0;
break;
}
}
if(ok)cout<<"Ordering is possible."<<endl;
else cout<<"The door cannot be opened."<<endl;
}
return 0;
}