题意:有向图的欧拉路的判断 :最多只能有两个点的入度不等于出度,而且必须其中一个点的出度恰好比入度大一(起点),另一个点的入度比出度大一(终点),当然图必须是连通的,而连通的判断就是从任意一点可以访问任何一点,刚我们用dfs的时候,必然会访问到所有的点 。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 105;
int vis[MAXN],G[MAXN][MAXN],N,T,in[MAXN],out[MAXN];
void dfs(int u)
{
vis[u] = true;
for(int i = 0 ; i < MAXN ; i++)
if(G[u][i] && !vis[i])
dfs(i);
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(G,0,sizeof(G));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
char str[1005];
scanf("%d",&N);
for(int i = 0 ; i < N ; i++)
{
scanf("%s",str);
G[str[0] - 'a'][str[strlen(str) - 1] - 'a']++;
out[str[0]-'a']++;
in[str[strlen(str) - 1] - 'a']++;
}
bool flag = true;
int num1 = 0,num2 = 0;
for(int i = 0 ; i < MAXN ; i++)
{
if(!flag)
break;
if(in[i] != out[i])
{
if(in[i] == out[i]+1)
num1++;
else if(in[i]+1 == out[i])
num2++;
else {
flag = false ;
break;
}
}
}
if(num1 && num2 && num1+num2 >2)
flag = false ;
if(flag)
{
memset(vis,0,sizeof(vis));
for(int i = 0 ; i < MAXN ; i++)
if(out[i])
{
dfs(i);
break;
}
bool flag2 = true;
for(int i = 0 ; i < MAXN ; i++)
{
if(in[i] && !vis[i])
{
flag2 = false;
break;
}
if(out[i] && !vis[i])
{
flag2 = false ;
break;
}
}
if(flag2)
printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}else printf("The door cannot be opened.\n");
}
return 0;
}