给你一个n个点,每个点度为k(k为偶数)的无向图,问是否能将图中的n条边染色,使得每个点都拥有两条被染色的边。也就是说,是否存在拥有原图中n条边的子图,使得每个点的度为2?仔细想想,每个点的度为2,实际上就是求原图的最小环覆盖了。

求最小环覆盖的方法就是先求出原图的有向欧拉回路(k为偶数,欧拉回路必然存在),然后问题就转化成了是否能选择欧拉回路中的n条边,使得所有点都被覆盖?这不就转化成了DAG的最小路径覆盖了么!

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<fstream>
  6. #include<sstream>
  7. #include<bitset>
  8. #include<vector>
  9. #include<string>
  10. #include<cstdio>
  11. #include<cmath>
  12. #include<stack>
  13. #include<queue>
  14. #include<stack>
  15. #include<map>
  16. #include<set>
  17. #define FF(i, a, b) for(int i=a; i<b; i++)
  18. #define FD(i, a, b) for(int i=a; i>=b; i--)
  19. #define REP(i, n) for(int i=0; i<n; i++)
  20. #define CLR(a, b) memset(a, b, sizeof(a))
  21. #define debug puts("**debug**")
  22. #define LL long long
  23. #define PB push_back
  24. using namespace std;
  25.  
  26. const int maxn = 1001;
  27. int g[maxn][maxn], degree[maxn], match[maxn], id[maxn][maxn];
  28. bool vis[maxn];
  29. int n, k, u, v;
  30.  
  31. void Euler()
  32. {
  33. FF(i, 1, n+1) if(degree[i])
  34. {
  35. int u = i;
  36. while(true)
  37. {
  38. FF(j, 1, n+1) if(g[u][j] && g[j][u])
  39. {
  40. g[j][u] = 0;
  41. degree[u]--, degree[i]--;
  42. u = j;
  43. break;
  44. }
  45. if(u == i) break;
  46. }
  47. }
  48. }
  49.  
  50. bool dfs(int u)
  51. {
  52. FF(i, 1, n+1) if(!vis[i] && g[u][i])
  53. {
  54. vis[i] = true;
  55. if(match[i] == 0 || dfs(match[i]))
  56. {
  57. match[i] = u;
  58. return true;
  59. }
  60. }
  61. return false;
  62. }
  63.  
  64. bool max_match()
  65. {
  66. CLR(match, 0);
  67. FF(i, 1, n+1)
  68. {
  69. CLR(vis, 0);
  70. if(!dfs(i)) return false;
  71. }
  72. return true;
  73. }
  74.  
  75. int main()
  76. {
  77. while(~scanf("%d%d", &n, &k))
  78. {
  79. CLR(degree, 0);CLR(g, 0);
  80. REP(i, n*k/2)
  81. {
  82. scanf("%d%d", &u, &v);
  83. g[u][v] = g[v][u] = 1;
  84. id[u][v] = id[v][u] = i+1;
  85. degree[u]++, degree[v]++;
  86. }
  87. Euler();
  88. if(max_match())
  89. {
  90. puts("YES");
  91. FF(i, 1, n+1) printf("%d\n", id[match[i]][i]);
  92. }
  93. else puts("NO");
  94. }
  95. return 0;
  96. }

sgu 286. Ancient decoration(最小环覆盖)的更多相关文章

  1. SGU 280.Trade centers(贪心)

    SGU 280.Trade centers 解题报告 题意: n(<=30000)个城市,(n-1)条道路,求最少需要选择多少个城市建造市场,使得所有城市到任意一个市场的距离不大于k. Solu ...

  2. TZOJ 2392 Bounding box(正n边形三点求最小矩形覆盖面积)

    描述 The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located ...

  3. Floyd求最小环!(转载,非原创) 附加习题(原创。)HDU-1599

    //Floyd 的 改进写法可以解决最小环问题,时间复杂度依然是 O(n^3),储存结构也是邻接矩阵 int mincircle = infinity; Dist = Graph; ;k<nVe ...

  4. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  5. Oracle数据库验证IMP导入元数据是否会覆盖历史表数据

    场景:imp导入数据时,最终触发器报错退出,并未导入存储过程.触发器.函数. 现在exp单独导出元数据,然后imp导入元数据,验证是否会影响已导入的表数据. 测试环境:CentOS 6.7 + Ora ...

  6. java继承覆盖与向上转型,权限

    子类可以覆盖父类的非final成员变量和重写非final方法 private私有变量和方法只能在类的内部使用,因此子类继承的同时会被隐藏,相当于不继承 protected变量,子类可以继承调用 方法被 ...

  7. 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题

    精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合 ...

  8. POJ 2125 Destroying the Graph 二分图最小点权覆盖

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8198   Accepted: 2 ...

  9. bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法

    筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...

随机推荐

  1. Marshal UTF8 Strings in .NET

    原文:Marshal UTF8 Strings in .NET Marshal UTF8 Strings in .NET Wow, what a pain in the butt. .NET stri ...

  2. .NET Page页面事件执行顺序,以及其作用(OnPreInit()、OnInit()等)

    以按钮事件为测试标准 1. OnPreInit //检查 IsPostBack 属性来确定是不是第一次处理该页. //创建或重新创建动态控件. //动态设置主控页. //动态设置 Theme 属性. ...

  3. C#数学运算表达式解释器

    C#数学运算表达式解释器 測试文件内容: a=2+3*2; b=2*(2+3); 浏览按钮事件处理程序: private void button_browse_Click(object sender, ...

  4. javascript(五)验证

    <input id="domo"  type="text"> <script> function my_function(){ var ...

  5. gcc和g++的区别【转自中国源码网】

    gcc和g++的区别[转自中国源码网] gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是 ...

  6. WiPlug_百度百科

    WiPlug_百度百科 WiPlug

  7. 指尖上的电商---(3)Solr全文搜索引擎的配置

    接上篇,Solr的准备工作完毕后,本节主要介绍Solr的安装,事实上Solr不须要安装.直接下载就能够了      1.Solr配置 下载地址 :http://lucene.apache.org/so ...

  8. UVA 534 - Frogger(kruskal扩展)

    UVA 534 - Frogger 题目链接 题意:给定一些点.如今要求一条路径从第一个点能跳到第二个点,而且这个路径上的最大距离是最小的 思路:利用kruskal算法,每次加最小权值的边进去,推断一 ...

  9. Keywords Search (ac 自己主动机)

    Keywords Search Problem Description In the modern time, Search engine came into the life of everybod ...

  10. VCL改变主窗体的方法

    使用如下语句即可Pointer((@Application.MainForm)^) := Form1; 仔细想想和Pointer((Application.MainForm)) := Form1;有什 ...