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

题意:

  妹妹有一条项链,这条项链由许多珠子串在一起组成,珠子是彩色的,两个连续的珠子的交汇点颜色相同,也就是对于相邻的两个珠子来说,前一个珠子的末端颜色和后一个珠子的首端颜色相同。有一天,项链断了,珠子洒落了一地,到处都是,妹妹使出浑身解数把地板上能看到的珠子(5-1000)都捡了起来,但是不确定是否收集齐了。给你他妹妹收集的珠子的两端的颜色编号(1 - 50),让你判断是否收集齐了。

思路:

  把颜色看成点,把一个珠子看成一个无向边,则问题有解,当且仅当图中存在欧拉回路。于是先判断由题意构建出来的无向图是否存在欧拉回路,无向图能否构建出来欧拉回路需要满足两个条件:

1:底图连通,可以用并查集或者DFS判断,这里利用并查集了。

2:不存在度数为奇数的点。

  判断完成后,利用DFS遍历整个图,每访问一个点就把这个点压入栈中,回溯时弹出来当前点并记录下来。随后得到的就是欧拉回路的点的顺序,连续的两个点就是问题需要输出的边。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <stack>
  8. #include <queue>
  9. using namespace std;
  10.  
  11. const int maxV = ;
  12. const int maxE = ;
  13. int degree[maxV + ];
  14. int pre[maxV + ];
  15. int head[maxV + ];
  16. int vis[maxE * + ];
  17. int E, V;
  18.  
  19. struct EdgeNode
  20. {
  21. int to;
  22. int next;
  23. }edges[ * maxE + ];
  24.  
  25. void initPre()
  26. {
  27. for(int i = ; i <= maxV; i++)pre[i] = i;
  28. }
  29.  
  30. int Find(int x)
  31. {
  32. return x == pre[x] ? x : pre[x] = Find(pre[x]);
  33. }
  34.  
  35. void mix(int x, int y)
  36. {
  37. int fx = Find(x);
  38. int fy = Find(y);
  39. if(fx != fy) pre[fx] = fy;
  40. }
  41.  
  42. int isEuler()
  43. {
  44. for(int i = ; i <= maxV; i++)
  45. if(degree[i] & ) return ;
  46. return ;
  47. }
  48.  
  49. int isConnct()
  50. {
  51. int cnt = ;
  52. for(int i = ; i <= maxV; i++)
  53. if(degree[i] && pre[i] == i) cnt++;
  54. if(cnt == ) return ;
  55. return ;
  56. }
  57.  
  58. stack<int> eu;
  59. int ans[maxE + ];
  60. int len;
  61. void eulerDFS(int now)
  62. {
  63. eu.push(now);
  64. for(int k = head[now]; k != -; k = edges[k].next)
  65. {
  66. if(!vis[k])
  67. {
  68. vis[k] = ;
  69. if(k & ) vis[k + ] = ;
  70. else vis[k - ] = ;
  71. eulerDFS(edges[k].to);
  72. }
  73. }
  74. ans[++len] = eu.top();//储存欧拉回路点的序列
  75. eu.pop();
  76. }
  77.  
  78. int main()
  79. {
  80. //freopen("in.txt", "r", stdin);
  81. int T;
  82. scanf("%d", &T);
  83. int kas = ;
  84. while(T--)
  85. {
  86. scanf("%d", &E);
  87. memset(degree, , sizeof(degree));
  88. memset(edges, , sizeof(EdgeNode));
  89. memset(head, -, sizeof(head));
  90. initPre();
  91. int st = ;//默认路径起点
  92. for(int i = ; i <= E; i++)
  93. {
  94. int u, v;
  95. scanf("%d%d", &u, &v);
  96. edges[ * i - ].to = v;//链式前向星存储无向图的边需正反各存一次
  97. edges[ * i - ].next = head[u];
  98. head[u] = * i - ;
  99. edges[ * i].to = u;
  100. edges[ * i].next = head[v];
  101. head[v] = * i;
  102. degree[u]++;
  103. degree[v]++;
  104. mix(u, v);
  105. st = min(st, min(u, v));
  106. }
  107. printf("Case #%d\n", ++kas);
  108. if(isConnct() && isEuler())
  109. {
  110. memset(vis, , sizeof(vis));
  111. memset(ans, , sizeof(ans));
  112. len = ;
  113. eulerDFS(st);
  114. for(int i = ; i < len; i++)//两个相邻的点构成一条边
  115. printf("%d %d\n", ans[i], ans[i + ]);
  116. }
  117. else
  118. printf("some beads may be lost\n");
  119. if(T)printf("\n");
  120. }
  121. return ;
  122. }

(PS:不只是题意没理解透还是什么,如果妹妹没捡起来的刚好也构成了欧拉回路,那么岂不是还是没收集齐嘛,不过等串起来应该会发现的 (逃......)

UVA 10054 The Necklace (无向图的欧拉回路)的更多相关文章

  1. UVa 10054 The Necklace(无向图欧拉回路)

    My little sister had a beautiful necklace made of colorful beads. Two successive beads in the neckla ...

  2. uva 10054 The Necklace 拼项链 欧拉回路基础应用

    昨天做了道水题,今天这题是比较水的应用. 给出n个项链的珠子,珠子的两端有两种颜色,项链上相邻的珠子要颜色匹配,判断能不能拼凑成一天项链. 是挺水的,但是一开始我把整个项链看成一个点,然后用dfs去找 ...

  3. UVa 10054 The Necklace BFS+建模欧拉回路

    算法指南 主要就是建立欧拉回路 #include <stdio.h> #include <string.h> #include <iostream> #includ ...

  4. UVA 10054 The Necklace 转化成欧拉回路

    题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着. 看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控 ...

  5. UVA 10054 The Necklace(欧拉回路,打印路径)

    题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. uva 10054 The Necklace(欧拉回路)

    The Necklace  My little sister had a beautiful necklace made of colorful beads. Two successive beads ...

  7. UVA 10054 the necklace 欧拉回路

    有n个珠子,每颗珠子有左右两边两种颜色,颜色有1~50种,问你能不能把这些珠子按照相接的地方颜色相同串成一个环. 可以认为有50个点,用n条边它们相连,问你能不能找出包含所有边的欧拉回路 首先判断是否 ...

  8. UVa 10054 The Necklace【欧拉回路】

    题意:给出n个珠子,珠子颜色分为两半,分别用1到50之间的数字表示, 现在给出n个珠子分别的颜色,问是否能够串成一个环.即为首尾相连,成为一个回路 判断是否构成一个环,即判断是否为欧拉回路,只需要判断 ...

  9. 【欧拉回路】UVA - 10054 The Necklace

    题目大意: 一个环被切割成了n个小块,每个小块有头尾两个关键字,表示颜色. 目标是判断给出的n个小块能否重构成环,能则输出一种可行解(按重构次序输出n个色块的头尾颜色).反之输出“some beads ...

随机推荐

  1. 剑指Offer - 九度1351 - 数组中只出现一次的数字

    剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...

  2. 《Cracking the Coding Interview》——第10章:可扩展性和存储空间限制——题目7

    2014-04-24 22:06 题目:搜索引擎问题,如果有一列100台服务器的集群,用来响应查询请求,你要如何设计query分发和cache策略? 解法:query分发可以用计算数字签名并对机器数取 ...

  3. Python列表深浅复制详解

    转自:https://www.cnblogs.com/blaomao/p/7239203.html 在文章<Python 数据类型>里边介绍了列表的用法,其中列表有个 copy() 方法, ...

  4. 洛谷P2678跳石头(提高)

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点. 在起点和终点之间,有 N 块岩石( ...

  5. Scrapy爬取到的中文数据乱码问题处理

    Scrapy爬取到中文数据默认是 Unicode编码的,于是显示是这样的: "country": ["\u56fd\u4ea7\u6c7d\u8f66\u6807\u5f ...

  6. 团队Alpha(八)冲刺

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  7. 201621123033 《Java程序设计》第2周学习总结

    1. 本周学习总结 ·学习了String类的特点,以及其与字符数组的关系等等. ·常量池的相关概念. ·包装类的特点. 2. 书面作业 1. String-使用Eclipse关联jdk源代码 1.1 ...

  8. bpf 指令集

    58 struct bpf_insn { 59 __u8 code; /* opcode */ 60 __u8 dst_reg:4; /* dest register */ 61 __u8 src_r ...

  9. git 上传项目到仓库

    git 上传项目到仓库 第一步:建立仓库! 1.create new repository! 创建时最好选择 init (Initialize this repository with a READM ...

  10. 通过VS2010性能分析来查找代码中那些地方最损耗资源

    在编写完成一个程序后,大家都比较关心程序的性能如何,想把程序优化得更好.很多时候凭个人直觉来优化程序是件非常不靠普的事情,即使你是一个优秀的开人员也很难准确地判断程序中那些出现问题.VS2010提供了 ...