您的位置:首页 > 其它

UVa 10129 - Play on Words

2012-08-01 13:49 369 查看
先用并查集检查连通性,再用判断入度与出度关系判断其是否为欧拉回路,只有其即联通且每节点入度出度之和至多有两个为奇数(俩奇数点为起始点和结束点,且入度出度只差只能为1),其才为欧拉回路~~

代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int p[30];
int find(int x)
{
return p[x] == x ? x : find(p[x]);
}
int main()
{
#ifdef state
freopen("sample.txt","r",stdin);
#endif
int num,count,i,in[30],out[30];
char a[100000+2][3],b[1000+5];
scanf("%d",&count);
while(count--)
{
int flag = 0;
memset(a,0,sizeof(a));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
scanf("%d",&num);
for(i = 0; i < 26; i++)
p[i] = i;
for(i = 0; i < num ; i++)
{
scanf("%s",b);
int len = strlen(b) - 1;
a[i][0] = b[0];
a[i][1] = b[len];
int p_in = a[i][0] - 'a',p_out = a[i][1] - 'a';
in[p_in]++;
out[p_out]++;
p_in=find(p_in);
p_out=find(p_out);
if(p_in!=p_out)
p[p_in] = p_out;
}
int ok = 1;
for(i = 0; !in[i] && !out[i]; i++);
int t = find(i);
for( i++; i < 26 ; i++ )
if((in[i] || out[i]) && find(i) != t)
{
ok = 0;
break;
}
int fct = 0;
if(ok)
for( i = 0; i < 26; i++ )
{
if( in[i] != out[i] && abs( in[i] - out[i] ) > 1)
{
flag = 1;
break;
}
else if( in[i] != out[i] )
fct++;
if( fct > 2 )
{
flag = 1;
break;
}
}
if(flag || !ok)
printf("The door cannot be opened.\n");
else
printf("Ordering is possible.\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: