2.解题思路:本题利用欧拉回路存在条件解决。可以将所有的单词看做边,26个字母看做端点,那么本题其实就是问是否存在一条路径,可以到达所有出现过的字符端点。由于本题还要求了两个单词拼在一起的条件是前一个单词的右端点和本单词的左端点一样。所以这是一个有向图。根据结论:有向图的底图(忽略边的方向后的图)必须连通;有向图中最多只能有两个端点的入度不等于出度,且必须是其中一点的入度比出度小1,另一点的入度比出度大1。因此先判断端点是否都连通,再判断每个端点的度数是否满足结论即可。

那么,如何判断连通性呢?第一种方法是利用DFS,第二种方法可以利用并查集。本题利用并查集来判断是否连通。

  1 #pragma comment(linker, "/STACK:1024000000,1024000000")
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<math.h>
  7 #include<algorithm>
  8 #include<queue>
  9 #include<set>
 10 #include<bitset>
 11 #include<map>
 12 #include<vector>
 13 #include<stdlib.h>
 14 #include <stack>
 15 using namespace std;
 16 int dirx[]={0,0,-1,1};
 17 int diry[]={-1,1,0,0};
 18 #define PI acos(-1.0)
 19 #define max(a,b) (a) > (b) ? (a) : (b)
 20 #define min(a,b) (a) < (b) ? (a) : (b)
 21 #define ll long long
 22 #define eps 1e-10
 23 #define MOD 1000000007
 24 #define N 100006
 25 #define inf 1e12
 26 int n;
 27 int u[N],v[N];
 28 int in[N],out[N];
 29 int vis[N];
 30 int fa[N];
 31 int num;
 32 void init(){
 33    memset(in,0,sizeof(in));
 34    memset(out,0,sizeof(out));
 35    memset(vis,0,sizeof(vis));
 36    for(int i=0;i<N;i++){
 37        fa[i]=i;
 38    }
 39    num=0;
 40 }
 41 /
 42 int find(int x){
 43    return fa[x]==x?x:fa[x]=find(fa[x]);
 44 }
 45 void merge(int x,int y){
 46    int root1=find(x);
 47    int root2=find(y);
 48    if(root1==root2) return;
 49    fa[root1]=root2;
 50 }
 51 //
 52 void solve(){
 53
 54     for(int i=0;i<n;i++){
 55         merge(u[i],v[i]);
 56     }
 57     int i=0;
 58     for(i;!vis[i];i++);
 59
 60     int x=find(i);//判断能否连通
 61     for(int j=i+1;j<26;j++){
 62         if(vis[j]){
 63            int y=find(j);
 64            if(x!=y){
 65                printf("The door cannot be opened.\n");
 66                return;
 67            }
 68         }
 69     }
 70
 71     int flag=1;
 72     int cnt=0;
 73     for(int i=0;i<26;i++){
 74         if(vis[i]){
 75            if(in[i]!=out[i]){
 76               if(in[i]==out[i]-1) cnt++;
 77               else if(in[i]==out[i]+1) cnt++;
 78               else{
 79                   flag=0;
 80                   break;
 81               }
 82            }
 83            if(cnt>2){
 84                flag=0;
 85                break;
 86            }
 87         }
 88     }
 89     if(flag){
 90         printf("Ordering is possible.\n");
 91     }
 92     else{
 93         printf("The door cannot be opened.\n");
 94     }
 95
 96 }
 97 int main()
 98 {
 99    int t;
100    scanf("%d",&t);
101    while(t--){
102
103          init();
104
105          char s[1006];
106          scanf("%d",&n);
107          for(int i=0;i<n;i++){
108              scanf("%s",s);
109              int len=strlen(s);
110              int a=s[0]-'a';
111              int b=s[len-1]-'a';
112              u[i]=a,v[i]=b;
113              in[a]++,out[b]++;
114              vis[a]=1;
115              vis[b]=1;
116          }
117          solve();
118    }
119     return 0;
120 }

View Code

UVA - 10129 Play on Words(欧拉回路+并查集)相关推荐

  1. I - Ant Trip (无向图欧拉回路+并查集),判断

    I - Ant Trip 参考博客:Ant Trip(欧拉回路+并查集) 参考:欧拉路径问题与欧拉回路问题 题意:给你无向图的 N 个点和 M 条边,保证这 M 条边都不同且不会存在同一点的自环边,现 ...

  2. hdu 1116 欧拉回路 并查集 一组字符串能否首尾相连成一个字符串

    主要是欧拉回路的基础知识,用并查集加工处理 注意欧拉回路和并查集的细节判断 不能粘贴复制,一定要理解之后再敲一遍代码,否则浪费更多的时间 #include <stdio.h> #inclu ...

  3. hdu 3018 图 欧拉回路 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=3018 题意  --许多蚂蚁 遍历一个图 每一条边只能走一次  问至少要把这些蚂蚁分为几群 说白了就是 至少几笔可 ...

  4. 牛客小白月赛2 D. 虚虚实实(欧拉回路,并查集)

    题目描述 震为雷,临危不乱,亨通畅达:巽为风,柔顺伸展,厚载万物. 震卦:洊雷,震,君子以恐惧修省.一口金钟在淤泥,人人拿着当玩石,忽然一日钟悬起,响亮一声天下知. 巽卦:随风,巽,君子以申命行事.一 ...

  5. poj 2513 Colored Sticks( 字典树哈希+ 欧拉回路 + 并查集)

    题目:http://poj.org/problem?id=2513 参考博客:http://blog.csdn.net/lyy289065406/article/details/6647445 htt ...

  6. Play on Words UVA - 10129 (欧拉回路)

    题目链接:https://vjudge.net/problem/UVA-10129 题目大意:输入N  代表有n个字符串  每个字符串最长1000  要求你把所有的字符串连成一个序列  每个字符串的第 ...

  7. Play on Words UVA - 10129 (有向图欧拉路径)

    Play on Words UVA - 10129 题意:n个单词,问能否收尾相连形成一条链. 把单词首尾字母看做点,单词内部连一条边,问是否存在欧拉路径. 用并查集,当且仅当只有一个点的出度比入度大 ...

  8. Uva 10129 单词

    题目链接:https://uva.onlinejudge.org/external/101/10129.pdf 把单词的首字母和最后一个字母看做节点,一个单词就是一个有向边.有向图的欧拉定理,就是除了 ...

  9. POJ - 2513 Colored Sticks(字典树+并查集+欧拉回路)

    题目链接:点击查看 题目大意:给出n个木棍,问若两两相连,最终能否构成一根长直木棍,相连的规则是两个木棍的相接端点的颜色需要保持相同 题目分析:关于这个题目,我们可以将每个木棍视为一条边,每个木棍的两 ...

最新文章

  1. 微生物组-扩增子16S分析研讨会(2020.1)
  2. “男儿有泪不轻弹”和“活着”
  3. 熟悉linux unix,熟悉这几个常用命令,你就是Linux/Unix的vi高手了。
  4. HTML+CSS+JS实现 ❤️HTML5图片幻灯片轮播切换❤️
  5. 浏览器与服务器响应流程-----(转)
  6. 从 Windows 换到 Mac,真没有想象中的那么难
  7. 数据库笔记07:实施数据完整性
  8. 思科 Security Manager 12个0day PoC 被公开,多个严重 0day仍未修复
  9. image.merge图像有什么变化_图像特征工程:HOG特征描述子介绍
  10. 利用MATLAB对乐曲进行钢琴演奏【matlab调音_1】
  11. cisco思科模拟器交换机和路由器基础命令
  12. arcgis公里坐标转经纬度_利用arcgis实现经纬度和平面坐标互转
  13. git命令之配置diff3冲突合并方式及KDiff3工具
  14. 源码:winamp播放器 C++
  15. html中加入计时器,javascript怎么做计时器?
  16. unity 物体移动方式的一些笔记
  17. BitCoinCore配置文件解读
  18. 解决No thread-bound request found: Are you referring to request attributes outside of an actual web...
  19. 开环控制系统与闭环控制系统
  20. 加州大学欧文计算机排名,2019加州大学欧文分校排名(USNews排名)

热门文章

  1. linux下测试权限,Linux下进程权限分析
  2. linux weblogic java_options_使用Linux脚本更新Weblogic部署的应用程序
  3. python安装lzo_hadoop-lzo 安装配置
  4. C语言丨小 学 数 学(二):高精度乘法
  5. 结构专业规范大全_一级注册结构工程师专业考试所使用的规范、标准、规程
  6. 牧马人鼠标g13鼠标宏_达尔优第五代牧马人EM915游戏鼠标评测
  7. java websocket 生存期_Java WebSocket生命周期
  8. android eclipse不能创建activity,在eclipse里面开发android应用,不能新建Activity
  9. Spring Security HttpSecurity.authorizeRequests
  10. python FastDFS