1. //给一个有向图,
  2. //找出若干环,使得这些环覆盖全部点且每一个点仅仅能在一个环中
  3. //问所得的全部环的全部边权值之和的最小值为多少
  4. //对于每一个点仅仅有一个入度和一个出度。那么将每一个点拆成
  5. //入度点和出度点,将全部入度点和全部出度点构成一个完备匹配
  6. //因为是完备匹配,所以每一个点的出度和入度都有一个不是自己的点
  7. //相连,那么将完备匹配的全部点连接起来一定是若干环
  8. //所得完备匹配的最小匹配即为答案
  9. #include<cstdio>
  10. #include<cstring>
  11. #include<iostream>
  12. using namespace std ;
  13. const int maxn = 210 ;
  14. const int inf = 0x3f3f3f3f ;
  15. int lx[maxn] , ly[maxn] , slack[maxn] ;
  16. int visx[maxn] , visy[maxn] , match[maxn] ;
  17. int map[maxn][maxn] ;
  18. int n , m ;
  19. int find(int x)
  20. {
  21. visx[x] = 1 ;
  22. for(int i = 1;i <= n;i++)
  23. {
  24. if(visy[i])continue ;
  25. int tmp = lx[x] + ly[i] - map[x][i] ;
  26. if(tmp == 0)
  27. {
  28. visy[i] = 1 ;
  29. if(match[i] == -1 || find(match[i]))
  30. {
  31. match[i] = x ;
  32. return true ;
  33. }
  34. }
  35. else slack[i] = min(slack[i] , tmp) ;
  36. }
  37. return false ;
  38. }
  39. int KM()
  40. {
  41. memset(ly , 0 , sizeof(ly)) ;
  42. memset(match , -1 , sizeof(match)) ;
  43. for(int i = 1;i <= n;i++)
  44. {
  45. lx[i] = -inf ;
  46. for(int j = 1;j <= n;j++)
  47. lx[i] = max(lx[i] , map[i][j]) ;
  48. }
  49. for(int i = 1;i <= n;i++)
  50. {
  51. for(int j = 1;j <= n;j++)
  52. slack[j] = inf ;
  53. while(1)
  54. {
  55. memset(visx , 0 ,sizeof(visx)) ;
  56. memset(visy , 0 ,sizeof(visy)) ;
  57. if(find(i))break ;
  58. int d = inf ;
  59. for(int j = 1;j <= n;j++)
  60. if(!visy[j])
  61. d = min(d , slack[j]) ;
  62. for(int j = 1;j <= n;j++)
  63. if(visx[j])
  64. lx[j] -= d ;
  65. for(int j = 1;j <= n;j++)
  66. if(visy[j])
  67. ly[j] += d ;
  68. else slack[j] -=d ;
  69. }
  70. }
  71. int ans = 0 ;
  72. for(int i = 1;i <= n;i++)
  73. ans += map[match[i]][i] ;
  74. return ans ;
  75. }
  76. int main()
  77. {
  78. int t ;
  79. scanf("%d" , &t) ;
  80. while(t--)
  81. {
  82. scanf("%d%d" , &n , &m) ;
  83. for(int i = 1;i <= n;i++)
  84. for(int j = 1;j <= n;j++)
  85. map[i][j] = -inf ;
  86. while(m--)
  87. {
  88. int u , v , w ;
  89. scanf("%d%d%d" , &u , &v , &w) ;
  90. if(u != v && -w > map[u][v])
  91. map[u][v] = -w ;
  92. }
  93. int ans = KM() ;
  94. printf("%d\n" , -ans) ;
  95. }
  96. return 0 ;
  97. }

hdu3488Tour KM算法的更多相关文章

  1. 匈牙利算法与KM算法

    匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...

  2. 【HDU2255】奔小康赚大钱-KM算法

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

  3. HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法

    二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...

  4. KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼

    感谢  http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...

  5. poj 2195 KM算法

    题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...

  6. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  7. HDU(2255),KM算法,最大权匹配

    题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. 二分图 最大权匹配 km算法

    这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...

  9. hdu 2255 奔小康赚大钱 KM算法

    看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了…… 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...

随机推荐

  1. Jmeter接口测试---JDBC简单实践

    我的环境:MySQL:mysql-5.6.24-win32 jdbc驱动:mysql-connector-java-5.1.22-bin.jar JMeter:apache-jmeter-2.13 1 ...

  2. Clickhouse DDL&DML

    (1)添加列: alter table [db.]table_name add column column_name [type] [default_expr] [after name_after] ...

  3. POJ_2536_Gopher II

    题意:n只地鼠,m个地鼠洞,地鼠必须以v的速度在s秒内钻进洞且每个洞仅能容纳一只地鼠,问最少有几只地鼠会被老鹰吃掉. 分析:最大匹配问题,将s秒内地鼠能够跑到的洞与该地鼠连成一条边,在最后得到的图中使 ...

  4. Jmeter之JDBC请求参数化(一)

    一.环境准备 a.jmeter5.1.1版本最新版本,可以去网页下载:https://jmeter.apache.org/download_jmeter.cgi b.jdbc驱动:链接:https:/ ...

  5. Duboo学习-SPI

    待补充 现将Dubbo-SPI相关源码流程图更新

  6. 使用JavaScript制作一个好看的轮播图

    目录 使用JavaScript制作出好看的轮播图效果 准备材料 1.图片若干张(包括轮播图和按钮的图片) 2.将按钮的图片应用到按钮上的CSS样式文件 3.实现轮播和点击跳转的JavaScript代码 ...

  7. enote笔记语言(3)(ver0.4)

    章节:enote笔记语言(3)     what&why(why not)&how&when&where&which:紫色,象征着神秘而又潜蕴着强大的力量,故取 ...

  8. <MyBatis>入门三 sqlMapper文件

    增加 1.增删改在接口中的返回值 Integer.Long.Boolean.void 返回影响多少行 或 true | false 2.mapper 中 增删改没有返回值 (resultType或re ...

  9. radis入门

    redis介绍 是远程的,有客户端.服务端 存内存,吃内存 应用场景 缓存 队列 list操作 push pop 数据存储[根据redis硬盘持久化的机制,这里不展开] 5种数据类型 string 字 ...

  10. Navicat使用技巧

    1.有时按快捷键Ctrl+F搜某条数据的时候搜不到,但是能用sql查出来,这是怎么回事? Ctrl+F只能搜本页数据,不在本页的数据搜不到,navicat每页只显示1000条数据.在数据多的时候nav ...