题目链接:

  Hdu 3488 Tour

题目描述:

  有n个节点,m条有权单向路,要求用一个或者多个环覆盖所有的节点。每个节点只能出现在一个环中,每个环中至少有两个节点。问最小边权花费为多少?

解题思路:

  因为每个节点就出现一个,那么每个节点出度和入度都为1咯。我们可以对每个节点u拆点为u,u',分别放在集合X,Y.然后对两个集合进行完备匹配。完备匹配成功以后,每个节点就会有只有一个出度,一个入度的。

用KM求最小匹配的话,先初始化maps为-INF,然后把各边权值存为负,求出最大值取反即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn = ;
  7. const int INF = 0x3f3f3f3f;
  8. int maps[maxn][maxn], used[maxn], s[maxn], n;
  9. int lx[maxn], ly[maxn];
  10. bool visx[maxn], visy[maxn];
  11. bool Find (int x)
  12. {
  13. visx[x] = ;
  14. for (int i=; i<=n; i++)
  15. {
  16. if (!visy[i] && lx[x]+ly[i]==maps[x][i])
  17. {
  18. visy[i] = ;
  19. if (!used[i] || Find(used[i]))
  20. {
  21. used[i] = x;
  22. return true;
  23. }
  24. }
  25. else
  26. s[i] = min (s[i], lx[x] + ly[i] - maps[x][i]);
  27. }
  28. return false;
  29. }
  30. int KM ()
  31. {
  32. memset (used, , sizeof(used));
  33. memset (lx, , sizeof(lx));
  34. memset (ly, , sizeof(ly));
  35. for (int i=; i<=n; i++)
  36. for (int j=; j<=n; j++)
  37. lx[i] = max (lx[i], maps[i][j]);
  38. for (int i=; i<=n; i++)
  39. {
  40. for (int j=; j<=n; j++)
  41. s[j] = INF;
  42. while ()
  43. {
  44. memset (visx, , sizeof(visx));
  45. memset (visy, , sizeof(visy));
  46. if (Find(i))
  47. break;
  48. int d = INF;
  49. for (int j=; j<=n; j++)
  50. if (!visy[j])
  51. d = min (s[j], d);
  52. for (int j=; j<=n; j++)
  53. {
  54. if (visx[j])
  55. lx[j] -= d;
  56. if (visy[j])
  57. ly[j] += d;
  58. }
  59. }
  60. }
  61. int res = ;
  62. for (int i=; i<=n; i++)
  63. res += maps[used[i]][i];
  64. return res;
  65. }
  66. int main ()
  67. {
  68. int m, t;
  69. scanf ("%d", &t);
  70. while (t --)
  71. {
  72. scanf("%d %d", &n, &m);
  73. for (int i=; i<=n; i++)
  74. for (int j=; j<=n; j++)
  75. maps[i][j] = -INF;
  76. while (m --)
  77. {
  78. int u, v, s;
  79. scanf ("%d %d %d", &u, &v, &s);
  80. maps[u][v] = max(maps[u][v], -s;
  81. }
  82. printf ("%d\n", -KM());
  83. }
  84. return ;
  85. }

Hdu 3488 Tour (KM 有向环覆盖)的更多相关文章

  1. hdu 3488 Tour

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意:给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都只 ...

  2. HDU 3488 Tour(最小费用流:有向环最小权值覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意: 给出n个点和m条边,每条边有距离,把这n个点分成1个或多个环,且每个点只能在一个环中,保证有解. ...

  3. HDU 3488 Tour (最大权完美匹配)【KM算法】

    <题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...

  4. 图论(二分图,KM算法):HDU 3488 Tour

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  5. HDU - 3488 Tour (KM最优匹配)

    题意:对一个带权有向图,将所有点纳入一个或多个环中,且每个点只出现一次,求其所有环的路径之和最小值. 分析:每个点都只出现一次,那么换个思路想,每个点入度出度都为1.将一个点拆成两个点,一个作为入度点 ...

  6. HDU 6311 Cover (无向图最小路径覆盖)

    HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...

  7. Tour HDU - 3488 有向环最小权值覆盖 费用流

    http://acm.hdu.edu.cn/showproblem.php?pid=3488 给一个无源汇的,带有边权的有向图 让你找出一个最小的哈密顿回路 可以用KM算法写,但是费用流也行 思路 1 ...

  8. HDU 3488 KM Tour

    参考题解 这题注意有重边.. #include <cstdio> #include <cstring> #include <algorithm> using nam ...

  9. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

随机推荐

  1. cef3的各个接口你知道几个

    CEF3基本的框架包含C/C++程 序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和 Chromium&Webkit的操作细节.它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户 ...

  2. grails的criteria和hql查询

    grails在查询方面也保留了hibernate的hql和criteria查询功能.hql自然不必多说基本不会有什么变化,grails的criteria查询在hibernate上面做了微调使用起来更加 ...

  3. python绘图入门

    python绘图入门 学习了:https://zhuanlan.zhihu.com/p/34200452 API:https://matplotlib.org/api/pyplot_api.html ...

  4. Android开发——本地验证码的简易实现

    0.  前言   验证码无处不在.有人问我,你知道达芬奇password以下是什么吗,对.答案就是达芬奇验证码. 验证码一个最基本的作用就是防止恶意暴力破解登录,防止不间断的登录尝试,事实上能够在se ...

  5. 重载OverLoad。隐藏new

    <1> using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...

  6. VS自己定义project向导开发(Custom Wizard)

     在vs2010中定制VC++project向导有例如以下两种方式: 改动现有向导.以满足自己的须要: 使用"自己定义向导"来产生一个向导骨架,并设计自己的向导. 本文档仅仅讨 ...

  7. Jenkins系列之-—02 email-ext 邮件模板

    邮件通知配置 系统管理 → 系统设置 → 邮件通知 SMTP 服务器:配置 SMTP 服务器.(不填默认本地运行服务器) 用户默认邮件后缀:注册用户邮件只需填写用户名即可,后缀会加该后缀,如果填写,则 ...

  8. Servlet第七课:ServletContext HttpSession 以及HttpServletRequest之间的关系

    课程目标: ① 在Servlet中懂得ServletContext HttpSession 以及HttpServletRequest之间的关系 ② 懂得怎样使用它们 概念介绍: 1. [共同点]不管对 ...

  9. [办公应用]让WORD自动显示到四级目录

    一般情况下,word的目录默认显示到三级目录.如果需要显示到四级目录,你会怎么操作呢? 只要按下图所示,单击“插入”-“引用”-“索引和目录” 然后单击“目录”选项卡,将“显示级别”处的3改为4即可. ...

  10. rhel6 中安装使用finger命令

    rhel6中默认没有finger 命令, 到rpm 包网上没有找到合适的, 然后在终端中输入rpm -qa|grep finger 查到了其相关的一个rpm包, 然 yum install finge ...