UVA 10129 Play on Words
2011-09-09 13:07
363 查看
UVA_10129[/b]
这个题目我一开始把一个字符串看成了一个点,这样就相当于去找是否存在一条不经过重复顶点的路径可以覆盖所有顶点,但这么去做的话会比较麻烦。
后来想了一下,实际上可以把一个字符串看成一条有向边,26个字母是顶点,这样就转化成了找是否存在一条不经过重复边的路径可以覆盖所有的边,实际上就是找是否存在欧拉道路了。
根据有向图的欧拉道路的结论(刘汝佳白书P112),首先,图必须是连通的,其次,最多只有两个点的入读不等于出度,而且必须是一个点的入读比出度大1,另一个点的出度比入读大1。
为了保证图是连通的,我们可以在读入数据的时候用并查集进行操作。同时要记录下每个顶点的出入度,为后续的工作做准备。
读完数据后首先去判断图是否连通,如果连通再去统计每个点的出、入度的情况即可。
这个题目我一开始把一个字符串看成了一个点,这样就相当于去找是否存在一条不经过重复顶点的路径可以覆盖所有顶点,但这么去做的话会比较麻烦。
后来想了一下,实际上可以把一个字符串看成一条有向边,26个字母是顶点,这样就转化成了找是否存在一条不经过重复边的路径可以覆盖所有的边,实际上就是找是否存在欧拉道路了。
根据有向图的欧拉道路的结论(刘汝佳白书P112),首先,图必须是连通的,其次,最多只有两个点的入读不等于出度,而且必须是一个点的入读比出度大1,另一个点的出度比入读大1。
为了保证图是连通的,我们可以在读入数据的时候用并查集进行操作。同时要记录下每个顶点的出入度,为后续的工作做准备。
读完数据后首先去判断图是否连通,如果连通再去统计每个点的出、入度的情况即可。
#include<stdio.h> #include<string.h> int indgr[30],outdgr[30],p[30]; char b[1010]; int find(int x) { return p[x]==x?x:(p[x]=find(p[x])); } int main() { int i,j,first,last,t,n,num,ok; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(indgr,0,sizeof(indgr)); memset(outdgr,0,sizeof(outdgr)); for(i=0;i<26;i++) p[i]=i; for(i=0;i<n;i++) { scanf("%s",b); first=b[0]-'a'; last=b[strlen(b)-1]-'a'; outdgr[first]++; indgr[last]++; if(find(first)!=find(last)) p[find(first)]=find(last); } num=0; ok=1; for(i=0;!indgr[i]&&!outdgr[i];i++); for(j=i+1;j<26;j++) if((indgr[j]||outdgr[j])&&find(i)!=find(j)) { ok=0; break; } if(ok) for(i=0;i<26;i++) { if(indgr[i]>outdgr[i]) { if(indgr[i]-outdgr[i]>1) { ok=0; break; } else num++; } else if(outdgr[i]>indgr[i]) { if(outdgr[i]-indgr[i]>1) { ok=0; break; } else num++; } } if(!ok||num>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
- uva 10129 Play on Words
- uva 10129 Play on Words(欧拉道路)
- uva 10129 - Play on Words
- UVa 10129 - Play on Words(DFS判连通+欧拉回路)
- Uva - 10129 - Play on Words
- uva 10129 Play on Words
- Play on Words,UVA 10129——求欧拉回路/欧拉通路
- UVa 10129 - Play on Words 欧拉道路
- UVA 10129 Play on Words
- UVA 10129 - Play on Words
- UVa 10129 - Play on Words, 欧拉道路
- HDU 1116 && UVA 10129 && POJ 1386 ------ Play on Words(欧拉路径 + 并查集)
- 【例题 6-15 UVA - 10129】Play on Words
- UVA-10129 Play on Words
- uva 10129 - Play on Words
- uva 10129 Play On Words(并查集法和DFS法)
- UVA 10129 Play on Words