1.欧拉回路:定义:经过图(有向图或无向图)中每条边一次且仅一次并且行遍图中每个顶点的回路( 闭合的欧拉路径,即一个环,保证每条边都通过且仅通过一次)
。
2.问题2:判断一个图是否有欧拉路径:
(1)图G是连通的,无孤立的点
。
(2)有向图每个点的入度等于出度
。
(3)有向图,可以存在两个点,其入度不等于出度,其中一个入度比出度大一,为路径的起点;另一个出度不入度大一,为路径的终点
。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
using namespace std;
const int maxx=5005;
const int inf=0x3f3f3f3f;
int indegree[maxx];
int vis[maxx];
int outdegree[maxx];
int n,m;
int cnt;
int mark;
char s[maxx];
vector<int>G[maxx];
void init(){
cnt=0;
mark=0;
m=0;
memset(indegree,0,sizeof(indegree));
memset(outdegree,0,sizeof(outdegree));
memset(vis,0,sizeof(vis));
for(int i=1;i<=66;i++){
G[i].clear();
}
}
void dfs(int u){
vis[u]=1;
cnt++;
if(cnt==m&&mark==0){
mark=1;
return ;
}
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(vis[v]==0){
dfs(v);
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
init();
int visited[maxx];
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++){
scanf("%s",&s);
int a=s[0]-'a'+1;
int b=s[strlen(s)-1]-'a'+1;
G[a].push_back(b);
G[b].push_back(a);
if(visited[a]==0){
visited[a]=1;
++m;
}
if(visited[b]==0){
visited[b]=1;
++m;
}
outdegree[a]++;
indegree[b]++;
}
int index;
for(index=1; index<=66; ++index) {
if(!G[index].empty()) {
break;
}
}
dfs(index);
if(mark==0){
cout<<"The door cannot be opened."<<endl;
continue;
}
int flag=1;
int ans1=0,ans2=0;
for(int i=1;i<=27;i++){
if(indegree[i]==outdegree[i]){
continue;
}else if(indegree[i]-outdegree[i]==1&&ans1==0){
ans1=1;
}else if(outdegree[i]-indegree[i]==1&&ans2==0){
ans2=1;
}else{
flag=0;
break;
}
}
if(mark==1&&flag==1){
cout<<"Ordering is possible."<<endl;
}else{
cout<<"The door cannot be opened."<<endl;
}
}
return 0;
}