本文链接:http://www.cnblogs.com/Ash-ly/p/5398627.html

题意:

  输入N(N <= 100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如:acm,malform,mouse)。每个单词最多包含 1000 个小写字母。输入中可以有重复的单词。

思路:

  把一个字母的两端开成节点,单词看成有向边,若问题有借,当且仅当图中存在欧拉通路。所有只需要判断由单词而构建的图是否存在欧拉通路,由于是有向边,所以利用有向图欧拉通路的判定就可以了。

判定条件

(1):底图是连通图

(2):可以有两个奇点,其中一个出度比入度大 1,另外一个入度比出度大1.

对于条件1,在这里用并查集判断了,条件2统计每个点的出度,入度,加以判断就行了.

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <math.h>
  5. #include <queue>
  6. #include <stack>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int maxV = ;
  11. int m;
  12. int pre[maxV + ];
  13. int outdegree[maxV + ];
  14. int indegree[maxV + ];
  15.  
  16. int Find(int x){return x == pre[x] ? x : pre[x] = Find(pre[x]); }//并查集的查找
  17. void initPre(){ for(int i = ; i <= maxV; i++) pre[i] = i; }//初始化并查集的数组
  18.  
  19. int mix(int x, int y)//并查集的合并
  20. {
  21. int fx = Find(x), fy = Find(y);
  22. if(fx != fy) pre[fx] = fy;
  23. }
  24.  
  25. bool isConnct()//判断图是否连通,即所有的点都在一个集合里面
  26. {
  27. int cnt = ;
  28. for(int i = ; i <= maxV; i++)if( (outdegree[i] != || indegree[i] != ) && pre[i] == i) cnt++;
  29. if(cnt == )return true;
  30. return false;
  31. }
  32.  
  33. bool isEulur()//是否存在欧拉通路
  34. {
  35. int cnt = ;
  36. int flag = ;
  37. for(int i = ; i <= ; i++)
  38. if((outdegree[i] != || indegree[i] != ) && (indegree[i] != outdegree[i]))//判断奇点,方法不唯一。
  39. {
  40. cnt++;
  41. flag += (indegree[i] - outdegree[i]);
  42. if(flag > || flag < -) return false;
  43. }
  44. if(cnt == || cnt == && flag == ) return true;
  45. return false;
  46. }
  47.  
  48. int main()
  49. {
  50. int T;
  51. scanf("%d", &T);
  52. while(T--)
  53. {
  54. scanf("%d", &m);
  55. initPre();
  56. memset(indegree, , sizeof(indegree));
  57. memset(outdegree, , sizeof(outdegree));
  58. for(int i = ; i <= m; i++)
  59. {
  60. char word[ + ];
  61. scanf("%s", word);
  62. int u = word[] - 'a' + ;
  63. int len = strlen(word);
  64. int v = word[len - ] - 'a' + ;
  65. mix(u, v);
  66. ++outdegree[u];
  67. ++indegree[v];
  68. }
  69. if(isEulur() && isConnct()) printf("Ordering is possible.\n");
  70. else printf("The door cannot be opened.\n");
  71. }
  72. return ;
  73. }

UVA 10129 Play on Words (欧拉通路)的更多相关文章

  1. ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)

    判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...

  2. POJ 1300 欧拉通路&欧拉回路

    系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...

  3. poj 2513 连接火柴 字典树+欧拉通路 好题

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27134   Accepted: 7186 ...

  4. poj2513- Colored Sticks 字典树+欧拉通路判断

    题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...

  5. hdu1116有向图判断欧拉通路判断

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash

    题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点   或者 ...

  7. 欧拉回路&欧拉通路判断

    欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...

  8. POJ2513Colored Sticks(欧拉通路)(字典树)(并查集)

                                                             Colored Sticks Time Limit: 5000MS   Memory ...

  9. HDU 5883 F - The Best Path 欧拉通路 & 欧拉回路

    给定一个图,要求选一个点作为起点,然后经过每条边一次,然后把访问过的点异或起来(访问一次就异或一次),然后求最大值. 首先为什么会有最大值这样的分类?就是因为你开始点选择不同,欧拉回路的结果不同,因为 ...

随机推荐

  1. 《Cracking the Coding Interview》——第16章:线程与锁——题目6

    2014-04-27 20:25 题目:关于java中标有synchronized的成员方法? 解法:这代表同一个对象实例的synchronized方法不能被多个线程同时调用.注意有这么多个地方都加粗 ...

  2. DOS程序员手册(十)

    终于到(十)了~~~ 503页 ES:DI       指向未更新且未打开的FCB的指针 注释:该功能最初用来从命令行中析取文件,并以正确的格式来保存此文件 以便打开FCB.为了实现这个目的,可首先将 ...

  3. python中的字符问题

    unicode/unicodebig/utf8 在python上默认情况下都解析不了 window系统中 ASCLL对应的是GBK unicode|unicodebigendian 对应 utf-16 ...

  4. Metadata 的概念

    https://www.ibm.com/developerworks/cn/cloud/library/1509_liukg_openstackmeta/ http://mathslinux.org/ ...

  5. python /usr/bin/python^M: bad interpreter: No such file

    今天在WingIDE下写了个脚本,传到服务器执行后提示: -bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No suc ...

  6. python杂七杂八知识点

    1.中文编码问题解决办法:# _*_ coding:UTF8 _*_ 2.numpy.ndArray a = array([[1,2,3], [4, 5, 6]]) 3.numpy.argsort() ...

  7. shell中的>&1和 >&2是什么意思?

    当初在shell中, 看到">&1"和">&2"始终不明白什么意思.经过在网上的搜索得以解惑.其实这是两种输出. 在 shell 程 ...

  8. Struts2 学习笔记

    1)Strust2是以WebWork为核心,采用拦截器的机制对用户请求进行处理. 2)Struts2框架结构: 3)简单来看整个Struts2的处理过程可以简单的理解为 用户的请求发送给对应的Acti ...

  9. NYOJ 42 一笔画

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  10. android自定义SlideMenu

                                                                   完美解决ListView中子项焦点不可被Touch的BUG. 1.在Ecl ...