poj 2016 Play on Words--欧拉通路

/*
	有向欧拉通路问题,把单词首尾字母当做点,单词是他们之间的关系
	1.此图连通
	2.有且仅有两个点出度和入度不同,但差是1;其余点的出度和入度相等
*/
#include
#include
#include
int r[30],c[30],ji[30];
char word[1000];
int root(int a)
{
	while(a!=ji[a])
		a=ji[a];
	return a;
}
int main()
{
	int t,n,i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		getchar();
		for(i=1;i<=26;i++)
		{
			ji[i]=i;
			r[i]=0;
			c[i]=0;
		}
		for(i=1;i<=n;i++)
		{
			gets(word);
			int len=strlen(word)-1;
			c[word[0]-'a'+1]++;
			r[word[len]-'a'+1]++;
			int p=root(word[0]-'a'+1),q=root(word[len]-'a'+1);
			if(pq)
				ji[p]=q;
		}
		i=1;
		while(!(c[i]+r[i]))
			i++;
		int o=root(i);
		for(;i<=26;i++)
			if((r[i]+c[i])&&root(i)!=o)
				break;
		if(i!=27)
		{
			printf("The door cannot be opened.\n");
			continue;
		}
		int num=0;
		for(i=1;i<=26;i++)
		{
			if(r[i]!=c[i]) 
				num++;
			if(num>2||abs(r[i]-c[i])>1)
				break;
		}
		if(i==27)
			printf("Ordering is possible.\n");
		else printf("The door cannot be opened.\n");
	}
	return 0;
}


 

你可能感兴趣的:(poj 2016 Play on Words--欧拉通路)