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

分析:开始的是有以为是二分匹配,然后发现并不能匹配,无法分成两个集合,网络流也不能搞,最后百度才知道是欧拉路径(从一点出发经过所有的路径,每条路只走一次),这个算法倒也不难理解,感觉很巧妙,如果点的入度都是偶数的话,那么就是欧拉回路(可以从一个点出发然后,最后还可以回到这个点结束),如果把所有的多米诺的编号当做节点,那么每个多米诺就是一条边,问题就转换成裸的欧拉路径题目了,判断是否是欧拉路径的时候需要注意,这个图是否是联通的。

代码如下:

===================================================================================================

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. const int MAXN = ;
  7.  
  8. struct Bridge
  9. {
  10. int u, v, next;
  11. int id, used;
  12. }edge[MAXN];
  13. int Head[MAXN], cnt;
  14.  
  15. int ans[MAXN], na;
  16.  
  17. void AddEdge(int u, int v, int id)
  18. {
  19. edge[cnt].u = u;
  20. edge[cnt].v = v;
  21. edge[cnt].id = id;
  22. edge[cnt].used = false;
  23. edge[cnt].next = Head[u];
  24. Head[u] = cnt++;
  25.  
  26. swap(u, v);
  27.  
  28. edge[cnt].u = u;
  29. edge[cnt].v = v;
  30. edge[cnt].id = id;
  31. edge[cnt].used = false;
  32. edge[cnt].next = Head[u];
  33. Head[u] = cnt++;
  34. }
  35.  
  36. void DFS(int k)
  37. {
  38. for(int i=Head[k]; i!=-; i=edge[i].next)
  39. {
  40. if(edge[i].used == false)
  41. {
  42. edge[i].used = edge[i^].used = true;
  43. DFS(edge[i].v);
  44. ans[na++] = i;
  45. }
  46. }
  47. }
  48.  
  49. int main()
  50. {
  51. int N, u, v;
  52.  
  53. scanf("%d", &N);
  54.  
  55. memset(Head, -, sizeof(Head));
  56. cnt = , na=;
  57.  
  58. int ru[MAXN] = {}, index=;
  59.  
  60. for(int i=; i<=N; i++)
  61. {
  62. scanf("%d%d", &u, &v);
  63. AddEdge(u, v, i);
  64. ru[u]++, ru[v]++;
  65.  
  66. index = u;
  67. }
  68.  
  69. int sum = ;
  70.  
  71. for(int i=; i<; i++)
  72. {
  73. if(ru[i] % )
  74. {
  75. sum ++;
  76. index = i;
  77. }
  78. }
  79.  
  80. if(sum != && sum != )
  81. printf("No solution\n");
  82. else
  83. {
  84. DFS(index);
  85.  
  86. if(na != N)
  87. printf("No solution\n");
  88. else
  89. {
  90. for(int i=; i<na; i++)
  91. printf("%d %c\n", edge[ans[i]].id, ans[i]% ? '+' : '-');
  92. }
  93. }
  94.  
  95. return ;
  96. }

Domino - SGU 101 (欧拉路径)的更多相关文章

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

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

  2. SGU 101

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

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

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

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

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

  5. SGU 101 Domino【欧拉路径】

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=101 题意: N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转 ...

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

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

  7. SGU 101.Domino (欧拉路)

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

  8. SGU 101 Domino 题解

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

  9. sgu 101 无向图有双重边的欧拉路径

    #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...

随机推荐

  1. java中Map的用法(HaspMap用法)

    public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. import java.util.HashMap; impo ...

  2. 数据库(学习整理)----5--Oracle常用的组函数

    其他: 1.oracle中下标是从1开始的,Java下标是从0开始的 函数分类: 日期函数 字符函数 转换函数 数学函数 系统函数 ---在当前月份上面:增加.减少月份 select add_mont ...

  3. Java8 map和reduce

    map final List<Integer> numbers = Arrays.asList(1, 2, 3, 4); final List<Integer> doubleN ...

  4. C++ trivial和non-trivial构造函数及POD类型(转)

    原博客地址http://blog.csdn.net/a627088424/article/details/48595525 最近正纠结这个问题就转过来了,做了点补充(参考<深度探索C++对象模型 ...

  5. 用3种方法在 operator= 中处理“自我赋值”

    假设你建立一个class 用来保存一个指针指向一块动态分配的位图. class Bitmap {......}; class Widget{ ... private: Bitmap* pb ; }; ...

  6. 分享一个自己写的基于TP的关系模型(2)

    1.增加多对多关系的处理 /** * 定义关系 * @return array */ public function test4(){ //参数说明 //关联的模型 //主表关联字段 //关联中间表 ...

  7. 桂电在线-转变成bootstrap版3(记录学习bootstrap)

    继续上文 正文菜单 html: <!-- 菜单块 --> <div class="on-light" id="menus"> <s ...

  8. 数据库基本概念-oracle介绍

    甲骨文公司,全称甲骨文股份有限公司是全球最大的企业软件公司,总部位于美国加利福尼亚州的红木滩.甲骨文是继Microsoft及IBM后,全球收入第三多的软件公司.甲骨文公司1989年正式进入中国市场.重 ...

  9. PDF转图片 C# with Adobe API

    PDF转图片大概有十几种方式,褒贬不一,我就详细给大家说一下我认为效率最高的方式,使用Adobe官方的SDK 安装acrobat reader 9.0以上即可,勾选如下组件.

  10. Remote Direct Memory Access (RDMA)

    RDMA有三类实现方式,包括RoCE,iWARP和InfiniBand.RDMA的基础是Virtual Interface Architechure (VIA). 参考文档: https://en.w ...