zoj 2016 && poj 1386 && uva 10129 Play on Words
来源:互联网 发布:改ip地址软件 编辑:程序博客网 时间:2024/06/07 22:13
题意:读入一组单词,判定是否可以经过重组使得每一个单词第一个字母跟前一个单词最后一个字母相同。若可以达到要求输出"Ordering is possible.",否则输出"The door cannot be opened."
分析: 其实这题就是判断有向图的欧拉通路是否存在,每一个单词可以看成一条边,一条从首字母到末字母的边,我们只需统计顶点的出度和入度,然后判断图的连通性就可以得到结果。
有向图的欧拉通路判定:图为连通图,除两个顶点外,其余顶点的出入度都相等,而这两个顶点的一个顶点出入度之差为1,另一个顶点的出入度之差为-1。
有向图的欧拉回路判定:图为连通图,所有顶点的出入度相等。
代码:
#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;const int maxn = 26;int n;char word[1500];bool vis[maxn];int in[maxn];//入度 int out[maxn];//出度 int p[maxn];void UFset(){for(int i = 0; i < maxn; i++)p[i] = -1;}int Find(int x){return p[x] >= 0 ? p[x] = Find(p[x]) : x;}void Union(int r1, int r2){r1 = Find(r1);r2 = Find(r2);int t = p[r1] + p[r2];if(p[r1] < p[r2]){p[r2] = r1;p[r1] = t;}else{p[r1] = r2;p[r2] = t;}}bool Connect(){int first = -1;for(int i = 0; i < maxn; i++){if(!vis[i]) continue;if(first == -1) first = i;if(Find(first) != Find(i)) return false;}return true;}int main(){int t;scanf("%d",&t);while(t--){scanf("%d",&n);UFset();for(int i = 0; i < maxn; i++){out[i] = 0; in[i] = 0; vis[i] = false;}for(int i = 0; i < n; i++){scanf("%s",word);int u = word[0] -'a';int v = word[strlen(word)-1] - 'a';out[u]++; in[v]++;vis[u] = vis[v] = true;if(Find(u) != Find(v))Union(u,v);}bool f = true;int s = 0;//出入度之差为1 int t = 0;//出入度之差为-1 for(int i = 0; i < maxn; i++){if(!vis[i]) continue;//当前字母没出现if(out[i] == in[i]) continue;//出入度相等 if(abs(out[i] - in[i]) >= 2){//出入度之差大于1 f = false; break;}if(out[i] - in[i] == 1){s++;if(s > 1){f = false; break;}}if(out[i] - in[i] == -1){t++;if(t > 1){f = false; break;}}}//end of for 0 to maxnif(s != t) f = false;if(!Connect()) f = false;puts(f?"Ordering is possible.":"The door cannot be opened.");}//end of while(t--)return 0;}
0 0
- zoj 2016 && poj 1386 && uva 10129 Play on Words
- zoj 2016 || poj 1386 Play on Words
- UVa 10129 & HDU 1116 & POJ 1386 - 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
- 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
- uva 10129 - Play on Words
- UVA 10129 Play on Words
- UVa 10129 Play on Words
- UVA 10129 - Play on Words
- POJ3498最大流,枚举终点,企鹅,基础最大流
- LPC1788IAP遇到的问题 SRC_ADDR_NOT_MAPPED
- Java动态代理总结
- POJ3723最大(或者小)生成树,构建军队,不错的题目
- 【C语言探索之旅】 第二部分第四课:字符串
- zoj 2016 && poj 1386 && uva 10129 Play on Words
- nodejs之mongoose数据类型Schema.type
- Java 冒泡排序
- RSA不同格式的key转换
- 旅行商问题
- Linux ip域名的禁止访问
- CollectionView上的headerView滞留问题
- 第二周项目3
- iOS推送获取不到设备token: 未找到应用程序的“aps-environment”的权利字符串