UVA 10441 - Catenyms

题目链接

题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母

思路:欧拉回路。利用并查集判联通,然后欧拉道路判定,最后dfs输出路径

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <vector>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int N = 30;
  10.  
  11. vector<string> g[N];
  12. vector<string> ans;
  13.  
  14. int t, n, parent[N];
  15. bool used[N][1005];
  16.  
  17. int find(int x) {
  18. return parent[x] == x ? x : parent[x] = find(parent[x]);
  19. }
  20.  
  21. int vis[N];
  22. int cnt, tot, ru[N], chu[N];
  23.  
  24. void init() {
  25. memset(ru, 0, sizeof(ru));
  26. memset(chu, 0, sizeof(chu));
  27. memset(vis, 0, sizeof(vis));
  28. memset(used, 0, sizeof(used));
  29. for (int i = 0; i < 26; i++) {
  30. g[i].clear();
  31. parent[i] = i;
  32. }
  33. cnt = 1; tot = 0;
  34. scanf("%d", &n);
  35. string s;
  36. while (n--) {
  37. cin >> s;
  38. int u = s[0] - 'a', v = s[s.length() - 1] - 'a';
  39. if (!vis[u]) {vis[u] = 1; tot++;}
  40. if (!vis[v]) {vis[v] = 1; tot++;}
  41. ru[v]++; chu[u]++;
  42. g[u].push_back(s);
  43. int pu = find(u);
  44. int pv = find(v);
  45. if (pu != pv) {
  46. parent[pu] = pv;
  47. cnt++;
  48. }
  49. }
  50. for (int i = 0; i < 26; i++)
  51. sort(g[i].begin(), g[i].end());
  52. }
  53.  
  54. void dfs(int u) {
  55. for (int i = 0; i < g[u].size(); i++) {
  56. int v = g[u][i][g[u][i].length() - 1] - 'a';
  57. if (used[u][i]) continue;
  58. used[u][i] = 1;
  59. dfs(v);
  60. ans.push_back(g[u][i]);
  61. }
  62. }
  63.  
  64. bool solve() {
  65. if (cnt != tot) return false;
  66. int Min = 30;
  67. int odd = 0, st;
  68. for (int i = 0; i < 26; i++) {
  69. if (g[i].size()) Min = min(Min, i);
  70. if (ru[i] - chu[i] == -1) {
  71. odd++;
  72. st = i;
  73. }
  74. else if (chu[i] - ru[i] == -1)
  75. odd++;
  76. else if (chu[i] != ru[i]) return false;
  77. if (odd > 2) return false;
  78. }
  79. ans.clear();
  80. if (!odd) dfs(Min);
  81. else dfs(st);
  82. for (int i = ans.size() - 1; i > 0; i--)
  83. cout << ans[i] << ".";
  84. cout << ans[0] << endl;
  85. return true;
  86. }
  87.  
  88. int main() {
  89. scanf("%d", &t);
  90. while (t--) {
  91. init();
  92. if (!solve()) printf("***\n");
  93. }
  94. return 0;
  95. }

UVA 10441 - Catenyms(欧拉道路)的更多相关文章

  1. Uva 10129 - Play on Words 单词接龙 欧拉道路应用

    跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...

  2. UVa 10129 Play On Words【欧拉道路 并查集 】

    题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...

  3. UVA 10129 Play on Words(欧拉道路)

    题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...

  4. 【UVa】12118 Inspector's Dilemma(欧拉道路)

    题目 题目     分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...

  5. Nyoj42 一笔画问题 (欧拉道路)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring ...

  6. 6-14 Inspector s Dilemma uva12118(欧拉道路)

    题意:给出一个国家城市个数n   所需走过道路个数e   每条道路长t   该国家任意两个城市之间都存在唯一道路长t     要求 :找一条最短的路遍历所有所需走过的路 一开始以为是图的匹配  但是好 ...

  7. POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)

    http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...

  8. UVA-10129 Play on Words (判断欧拉道路的存在性)

    题目大意:给出一系列单词,当某个单词的首字母和前一个单词的尾字母相同,则这两个单词能链接起来.给出一系列单词,问是否能够连起来. 题目分析:以单词的首尾字母为点,单词为边建立有向图,便是判断图中是否存 ...

  9. UVA10129———欧拉道路

    题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...

随机推荐

  1. 【剑指offer】面试题 2. 实现 Singleton 模式

    面试题 2. 实现 Singleton 模式 题目:设计一个类,我们只能生成该类的一个实例. 单例模式:确保一个类只有一个实例,并提供了一个全局访问点. Java 实现 1.饿汉模式 //饿汉模式 p ...

  2. For input string: "..."

    之前在项目中通过EL表达式从cart 中取出itemPirce这个值时始终报:For input string: "${cart.itemPrice / 100}" 错误. 事故原 ...

  3. 洛谷P1129 [ZJOI2007] 矩阵游戏

    题目传送门 分析:看到这题呢,首先想到的就是搜索,数据范围也不大嘛.但是仔细思考发现这题用搜索很难做,看了大佬们的题解后学到了,这一类题目要用二分图匹配来做.可以知道,如果想要的话,每一个子都可以移动 ...

  4. Oracle实例,具体运用

    Oracle关键字的使用 使用insert 添加数据: INSERT  INTO  表名  VALUES  (加入对应的数); COMMIT; INSERT INTO p_emp VALUES('TO ...

  5. scrapy抓取拉勾网职位信息(三)——爬虫rules内容编写

    在上篇中,分析了拉勾网需要跟进的页面url,本篇开始进行代码编写. 在编写代码前,需要对scrapy的数据流走向有一个大致的认识,如果不是很清楚的话建议先看下:scrapy数据流 本篇目标:让拉勾网爬 ...

  6. Redux 中间件的执行顺序理解

    Redux.applyMiddleware(thunk, middleware1) 和 Redux.applyMiddleware(middleware1, thunk) 的区别: <!DOCT ...

  7. Line Reflection -- LeetCode

    Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...

  8. hdu 4055 Number String (基础dp)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. [DesignPattern]Builder设计模式

    模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部件或零件,都可以装配到一个对象中,但是 ...

  10. Scala访问修饰符

    Scala 访问修饰符基本和Java的一样,分别有:private,protected,public. 如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public. Scala ...