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; }
相关文章推荐
- 【例题 6-16 UVa 10129】Play on Words
- UVA 10129 - Play on Words
- UVA - 10129 Play on Words
- uva 10129 - Play on Words
- UVa 10129 & HDU 1116 & POJ 1386 - Play on Words
- uva 10129 Play on Words
- 【欧拉路的判断 DFS判断连通】UVA - 10129 Play on Words
- uva 10129 Play on Words
- UVA 10129 Play on Words
- UVa 10129 (并查集 + 欧拉路径) Play on Words
- UVA 10129 Play on Words(欧拉道路)
- uva 10129 Play on Words
- Play on Words - UVa 10129 欧拉回路
- UVA - 10129 Play on Words
- UVA - 10129Play on Words(欧拉路)
- UVA10129 Play on Words —— 欧拉回路
- UVA-10129 Play on Words (判断欧拉道路的存在性)
- UVA - 10129 - Play on Words (欧拉路+并查集)
- UVA 10129 Play on Words
- UVa 10129 Play On Words【欧拉道路 并查集 】