uva 10129

题意:有向图的欧拉路的判断 :最多只能有两个点的入度不等于出度,而且必须其中一个点的出度恰好比入度大一(起点),另一个点的入度比出度大一(终点),当然图必须是连通的,而连通的判断就是从任意一点可以访问任何一点,刚我们用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;
}



你可能感兴趣的:(uva 10129)