我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路。。
这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了。
有向图包含欧拉通路的充要条件是:首先基图连通,然后是所有点的入度=出度 或者 有且只有一点出度=入度+1(起点)且有且只有一点入度=出度+1(终点)。
#include<cstdio>
#include<cstring>
using namespace std; int par[];
int Find(int a){
while(par[a]!=a){
par[a]=par[par[a]];
a=par[a];
}
return a;
}
void Union(int a,int b){
int pa=Find(a),pb=Find(b);
if(pa==pb) return;
par[pa]=pb;
} int main(){
int t,n;
char s[];
scanf("%d",&t);
while(t--){
int deg[]={};
bool vis[]={};
for(int i=; i<; ++i) par[i]=i; scanf("%d",&n);
for(int i=; i<n; ++i){
scanf("%s",s);
++deg[s[]-'a']; --deg[s[strlen(s)-]-'a'];
vis[s[]-'a']=vis[s[strlen(s)-]-'a']=;
Union(s[]-'a',s[strlen(s)-]-'a');
} int cnt0=,cnt1=,cnt2=,cnt3=;
for(int i=; i<; ++i){
if(vis[i] && par[i]==i) ++cnt0;
if(deg[i]==-) ++cnt1;
else if(deg[i]==) ++cnt2;
else if(deg[i]!=) ++cnt3;
}
if(cnt0> || cnt3!= || !(cnt1==&&cnt2== || cnt1==&&cnt2==)) puts("The door cannot be opened.");
else puts("Ordering is possible.");
}
return ;
}