UVa10129 - Play on Words

题目地址:点击打开链接

并查集和欧拉回路

C++代码:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
bool flag;
int d[700];
int find_father(int x)
{
	while(d[x]!=-1)
		return find_father(d[x]);
	return x;
}
int main()
{
	int m;
	while(cin>>m)
	{
		while(m--)
		{
			int n;
			cin>>n;
			int a[26][2];//0:in;1:out
			memset(a,0,sizeof(a));
			int i;
			for(i=0;i<700;++i)
				d[i]=-2;
			for(i=0;i<n;++i)
			{
				string s;
				cin>>s;
				int x=s[0]-'a';
				int y=s[s.size()-1]-'a';
				++a[x][0];
				++a[y][1];
				if(d[x]==-2)
					d[x]=-1;
				if(d[y]==-2)
					d[y]=-1;
				int father_x=find_father(x),father_y=find_father(y);
				if(father_x!=father_y)
					d[father_x]=father_y;
			}
			int equal=0,less=0,greater=0;
			bool flag=true;
			for(i=0;i<26;++i)
			{
				if(a[i][0]==a[i][1])
					++equal;
				else
				{
					if(a[i][0]-a[i][1]==1)
						++greater;
					else
					{
						if(a[i][1]-a[i][0]==1)
							++less;
						else
						{
							flag=false;
							break;
						}
					}
				}
			}
			int num=0;
			for(i=0;i<700;++i)
			{
				if(d[i]==-1)
					++num;
			}
			if(flag&&((less==0&&greater==0)||(less==1&&greater==1))&&num==1)
				cout<<"Ordering is possible."<<endl;
			else
				cout<<"The door cannot be opened."<<endl;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值