题目大意:这是一个多米诺骨游戏,这个游戏的规则就是一个连着一个,现在给出 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. iOS中打印系统详细日志

    Q:如何打印当前的函数和行号? A:我们可以在打印时使用一些预编译宏作为打印参数,来打印当前的函数和行号.如: 1 NSLog(@"%s:%d obj=%@", __func__, ...

  2. 简单的背包问题(入门)HDU2602 HDU2546 HDU1864

    动态规划,我一直都不熟悉,因为体量不够,所以今天开始努力地学习学习. 当然背包从01开始,先选择了一个简单的经典的背包HDU2602. Many years ago , in Teddy's home ...

  3. wamp不能使用phpmyadmin,提示“You don't have permission to access /phpmyadmin/ on this server.” 转载

    换了win8之后wamp明显不怎么好用了,显示80端口被system占用,后是masql出现了403错误,多番百度谷歌找到了解决方案,这里与大家分享 当你安装完成wamp后,打开localhost或i ...

  4. 关于boost::function与boost::bind函数的使用心得

    最近开始写一个线程池,期间想用一个通用的函数模板来使得各个线程执行不同的任务,找到了Boost库中的function函数. Boost::function是一个函数包装器,也即一个函数模板,可以用来代 ...

  5. CSS3中的选择器

    首先, CSS即层叠样式表(Cascading StyleSheet) CSS3是CSS技术的升级版本,CSS3语言开发是朝着模块化发展的 模块包括: 盒子模型.列表模块.超链接方式 .语言模块 .背 ...

  6. Git新手入门手册

    1.配置email及name git config --global user.email "guxuelong@f-road.com.cn" git config --globa ...

  7. Spring MVC小结1

    由于最近刚开始学Spring MVC,所以来讲一下自己的理解. 首先进行环境配置: 1.jdk 2.myeclipse 3.tomcat 4.maven 配置maven的时候出现了一个小的问题,JAV ...

  8. dispatch队列

    GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用.所以说,结合bloc ...

  9. 翻译qmake文档 目录(四篇)

    http://www.cnblogs.com/li-peng/p/4026133.html

  10. 使用maven profile实现多环境可移植构建

    mvn clean package -Pproduction即构建出生产环境需要的war包 mvn tomcat:redeploy -Ptest 即发布到测试环境 在开发过程中,我们的软件会面对不同的 ...