uva 10129 - Play on Words
2012-02-03 19:09
267 查看
需要了解几个知识:并查集(见《算法竞赛入门经典》第11章。)把26个字母当做节点,每个单词表示一条边。用这样的方式建图,比较入度与出度的大小关系即可。见《算法竞赛入门经典》第六章欧拉回路相关知识。另外,如果读取的字符数组开的不够大,会引起runtime error错误。
#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn=1010,maxm=30; char s[maxn];//not char s[maxm] int in[maxm],out[maxm],p[maxm];//indgree,outdgree int find(int x) { return p[x]==x?x:p[x]=find(p[x]); } int main() { #ifndef ONLINE_JUDGE freopen("10129.txt","r",stdin); #endif int T; scanf("%d",&T); while(T--) { int i,N; scanf("%d",&N); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for(i=0;i<26;i++) p[i]=i; for(i=0;i<N;i++) { scanf("%s",&s); int first=s[0]-'a'; int last=s[strlen(s)-1]-'a'; out[first]++; in[last]++; first=find(first); last=find(last); if(first!=last) p[first]=last; } for(i=0;!in[i] && !out[i];i++); bool ok=true; int t=find(i),j=i; for(i++;i<26;i++) if((in[i] || out[i]) && find(i)!=t) { ok=false; break; } t=0; if(ok) { for(i=j;i<26;i++) { int k=abs(in[i]-out[i]); if(k>1) { ok=false; break; }else if(k==1) t++; } } if(!ok || t>2) printf("The door cannot be opened.\n"); else printf("Ordering is possible.\n"); } return 0; }
相关文章推荐
- UVa 10129 - Play on Words
- UVa 10129 - Play on Words(欧拉道路)
- Uva10129——Play on Words
- 例题6-16 单词(Play On Words, UVa 10129)
- ACM篇:Uva 10129 -- Play on Words
- zoj 2016 && poj 1386 && uva 10129 Play on Words
- UVA - 10129 Play on Words (欧拉路径+dfs)
- Uva 10129 - Play on Words
- UVa 10129 Play on Words ( euler path )
- uva 10129 Play on Words(欧拉路)
- UVA - 10129 Play on Words
- uva 10129 - Play on Words
- 例题6-16 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 poj 1386 hdu 1116 zoj 2016 play on words
- UVA - 10129 Play on Words
- UVA Play On Words 10129