题目链接:

http://acm.sgu.ru/problem.php?contest=0&problem=101

题意:

N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转以调换其左右两数),求一种把这些骨牌从左到右排列的方案,使得所有相邻的两数字相等(即左边骨牌右侧的数字等于右边骨牌左侧的数字)。

分析:

把数字当成点,骨牌当做边。构成无向图,求一发欧拉道路即可。

无向图求欧拉路径还是很好写的。

欧拉路径深入讲解:http://blog.chinaunix.net/uid-26380419-id-3164913.html

代码:

  1. #include<iostream>
  2. #include<map>
  3. #include<cstring>
  4. #include<stack>
  5. #include<set>
  6. using namespace std;
  7. const int maxn = 200 + 5, maxm = 6 + 5;
  8. struct Edge{int to;int dir; int id;int next;};
  9. int tot = 0;
  10. Edge edge[maxn];
  11. stack<Edge>s;
  12. int pa[maxn], head[maxm], cnt[maxm];
  13. bool vis[maxn];
  14. int _find(int a)
  15. {
  16. if(a == pa[a]) return a;
  17. return pa[a] = _find(pa[a]);
  18. }
  19. void unite(int a, int b)
  20. {
  21. int ra = _find(a);
  22. int rb = _find(b);
  23. if(ra == rb) return ;
  24. pa[rb] = ra;
  25. }
  26. bool same(int a, int b)
  27. {
  28. return _find(a) == _find(b);
  29. }
  30. void add_edge(int u, int v, int id)
  31. {
  32. edge[tot].to = v;
  33. edge[tot].id = id;
  34. edge[tot].dir = 1;
  35. edge[tot].next = head[u];
  36. head[u] = tot++;
  37. edge[tot].to = u;
  38. edge[tot].dir = 0;
  39. edge[tot].id = id;
  40. edge[tot].next = head[v];
  41. head[v] = tot++;
  42. }
  43. void dfs(int u)
  44. {
  45. for(int i = head[u]; i != -1; i = edge[i].next){
  46. if(!vis[i]){
  47. vis[i] = true;
  48. vis[i^1] = true;
  49. dfs(edge[i].to);
  50. s.push(edge[i]);
  51. }
  52. }
  53. }
  54. int main (void)
  55. {
  56. int n ;cin>>n;
  57. memset(head, -1, sizeof(head));
  58. for(int i = 0; i <= 6; i++) pa[i] = i;
  59. int a, b;
  60. for(int i = 0; i < n; i++){
  61. cin>>a>>b;
  62. add_edge(a, b, i + 1);
  63. cnt[a]++;
  64. cnt[b]++;
  65. unite(a, b);
  66. }
  67. int be = -1;
  68. int ans = 0;
  69. for(int i = 0; i <= 6; i++){
  70. if(cnt[i] & 1){
  71. ans++;
  72. if(be == -1) be = i;
  73. }
  74. }
  75. if(ans != 0 && ans != 2) return cout<<"No solution"<<endl, 0;
  76. for(int i = 0; i <= 6; i++){
  77. if(cnt[i] && be == -1) be = i;
  78. if(cnt[i] && !same(i, be)){return cout<<"No solution"<<endl, 0;}
  79. }
  80. dfs(be);
  81. while(!s.empty()){
  82. Edge t = s.top();s.pop();
  83. cout<<t.id<<' ';
  84. if(t.dir == 0) cout<<"-"<<endl;
  85. else cout<<"+"<<endl;
  86. }
  87. return 0;
  88. }

SGU 101 Domino【欧拉路径】的更多相关文章

  1. SGU 101.Domino( 欧拉路径 )

    求欧拉路径...直接dfs即可,时间复杂度O(N) -------------------------------------------------------------------------- ...

  2. SGU 101 Domino (输出欧拉路径)

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...

  3. sgu 101 Domino 解题报告及测试数据

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB 题解: 求多米诺骨牌按照一定方式放置能否使相邻的位置 ...

  4. Domino - SGU 101 (欧拉路径)

    题目大意:这是一个多米诺骨游戏,这个游戏的规则就是一个连着一个,现在给出 N 个多米诺,每个多米诺两边都有一个编号,相邻的多米诺的编号要一致,当然多米诺是可以翻转的(翻转就加‘-’,不翻转是‘+’), ...

  5. SGU 101.Domino (欧拉路)

    时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个   方形,两边 ...

  6. SGU 101 Domino 题解

    鉴于SGU题目难度较大,AC后便给出算法并发布博文,代码则写得较满意后再补上.——icedream61 题目简述:暂略 AC人数:3609(2015年7月20日) 算法: 这题就是一笔画,最多只有7个 ...

  7. sgu 101 domino

    题意还算简洁明了,加上有道翻译凑过着读完了题.题意大体上是 给你 n 个多米诺骨牌, 给出每个骨牌两端的数字, 只有数字相同才可以推到, 比如 2-3和3-2.你可以旋转这些多米诺骨牌, 输出一个可以 ...

  8. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  9. SGU 101

    SGU 101,郁闷,想出来算法,但是不知道是哪个地方的问题,wa在第四个test上. #include <iostream> #include <vector> #inclu ...

随机推荐

  1. mysql导出数据库某些表的数据

    # 导出数据,一般从从库导出,减少主库的压力.mysqldump -hhostname -P3306 --single-transaction --master-data= database_name ...

  2. Opencv中的阈值函数

    OpenCV基础——threshold函数的使用 图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果. 参数原型 参数说明 src:源图像,可以为8位的灰度 ...

  3. web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript 浏览器对象

    1.window对象 1.1.window对象: window对象是BOM的核心,window对象指当前的浏览器窗口 所有javaScript全局对象.函数以及变量均自动生成为window对象的成员 ...

  4. 项目中的那些事---下载pdf文件

    最近做了一个下载pdf文档的需求,本以为使用HTML5中<a>标签的属性download就能简单搞定,不料IE竟然不支持这一简单粗暴的H5新特性,而是直接在网页中打开, 于是各种搜索之后得 ...

  5. GIT → 09:TortoiseGit 图形化工具

    GIT → 09:TortoiseGit 图形化工具

  6. 2019.9.16 csp-s模拟测试44 反思总结

    虽然说好像没有什么写这个的价值OAO 来了来了来写总结了,不能怨任何东西,就是自己垃圾x 开题顺序又和主流背道而驰,先一头扎进了公认最迷的T2,瞎搞两个小时头铁出来,然后T1和T3爆炸.基础很差,全靠 ...

  7. 集训队日常训练20180513-DIV1

    A.3132 给一个有向图,问能否从任意点出发都能进入一个环中. 深搜. #include<bits/stdc++.h> using namespace std; ; vector< ...

  8. Spring 社区的首个国产开源项目顺利毕业

    相信大家对上周的 <来自 Spring Cloud 官方的消息,Spring Cloud Alibaba 即将毕业>文章记忆犹新.本周,Spring Cloud Alibaba 正式毕业, ...

  9. 考试总结 模拟27(W)

    心得:太弱了,T1问题:理解错了题,矿石可以放到同一处,,太弱了,小凯的疑惑,没什么印象T2问题:拆式子T3问题:换根dp的思想模拟9T1+T2

  10. oracle-OFA模型

    用于unix文件系统和安装点的命名约定 用于目录路径的命名约定 用于数据文件的命名约定 用于oracle相关文件的标准位置