题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255

题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要求所有人回去的距离最短.

KM算法模板题~

  1. #include "stdio.h" //hdu 2255
  2. #include "string.h"
  3. #include "stdlib.h"
  4.  
  5. #define N 305
  6. #define INF 0x3fffffff
  7.  
  8. int n;
  9. int match[N];
  10. int map[N][N];
  11. int lx[N],ly[N];
  12.  
  13. bool s[N],t[N];//s[],t[]记录当前左/右第i个点是否在匈牙利树中
  14.  
  15. inline int MIN(int a,int b) { return a<b?a:b; }
  16. inline int MAX(int a,int b) { return a>b?a:b; }
  17.  
  18. bool find(int x) //匈牙利,匹配(找增广路)
  19. {
  20. int y;
  21. s[x] = true;
  22. for(y=1; y<=n; ++y)
  23. {
  24. if(!t[y] && lx[x]+ly[y]==map[x][y])
  25. {
  26. t[y] = true;
  27. if(match[y]==-1 || find(match[y]))
  28. {
  29. match[y] = x;
  30. return true;
  31. }
  32. }
  33. }
  34. return false;
  35. }
  36.  
  37. int KM()
  38. {
  39. int i,j,k;
  40. int ans=0;
  41. memset(match,-1,sizeof(match));
  42. memset(lx,0,sizeof(lx));
  43. memset(ly,0,sizeof(ly));
  44. for(i=1; i<=n; ++i) //初始化S顶标为最大权
  45. {
  46. for(j=1; j<=n; ++j)
  47. lx[i] = MAX(lx[i],map[i][j]);
  48. }
  49. for(i=1; i<=n; ++i) //匹配每一个点
  50. {
  51. while(1)
  52. {
  53. memset(s,0,sizeof(s));
  54. memset(t,0,sizeof(t));
  55. if(find(i)) //点i匹配成功
  56. break;
  57. else //匹配失败,找最小值num
  58. {
  59. int num = INF;
  60. for(j=1; j<=n; ++j)
  61. {
  62. if(s[j]) //j在匈牙利树中
  63. {
  64. for(k=1; k<=n; ++k)
  65. {
  66. if(!t[k]) //k在匈牙利树外
  67. num = MIN(num,lx[j]+ly[k]-map[j][k]);
  68. }
  69. }
  70. }
  71. for(k=1; k<=n; ++k) //修改顶标
  72. {
  73. if(s[k]) lx[k] -= num; //保证至少有一条边可以加入
  74. if(t[k]) ly[k] += num; //保证原来匹配的边修改后依然可以匹配
  75. }
  76. }
  77. }
  78. }
  79. for(i=1; i<=n; ++i)
  80. ans += map[match[i]][i];
  81. return ans;
  82. }
  83.  
  84. int main()
  85. {
  86. int i,j;
  87. while(scanf("%d",&n)!=-1)
  88. {
  89. for(i=1; i<=n; ++i)
  90. {
  91. for(j=1; j<=n; ++j)
  92. scanf("%d",&map[i][j]);
  93. }
  94. printf("%d\n",KM());
  95. }
  96. return 0;
  97. }

hdu 2255 奔小康赚大钱--KM算法模板的更多相关文章

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=2255 一,KM算法:(借助这个题写一下个人对km的理解与km模板) KM算法主要是用来求解图的最优匹 ...

  2. HDU - 2255 奔小康赚大钱 KM算法 模板题

    HDU - 2255 题意: 分配n所房子给n个家庭,不同家庭对一所房子所需缴纳的钱是不一样的,问你应当怎么分配房子,使得最后收到的钱最多. 思路: KM算法裸题.上模板 #include <i ...

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

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

  4. HDU 2255 奔小康赚大钱 KM算法的简单解释

    KM算法一般用来寻找二分图的最优匹配. 步骤: 1.初始化可行标杆 2.对新加入的点用匈牙利算法进行判断 3.若无法加入新编,修改可行标杆 4.重复2.3操作直到找到相等子图的完全匹配. 各步骤简述: ...

  5. HDU 2255 奔小康赚大钱 KM算法题解

    KM算法求的是完备匹配下的最大权匹配,是Hungary算法的进一步,由于Hungary算法是最大匹配的算法,不带权. 经典算法,想不出来的了,要參考别人的.然后消化吸收吧. 由于真的非常复杂的算法. ...

  6. hdu 2255 奔小康赚大钱 (KM)

    奔小康赚大钱Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. HDU 2255 奔小康赚大钱 KM裸题

    #include <stdio.h> #include <string.h> #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; ...

  8. 二分图最大权匹配问题&&KM算法讲解 && HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

  9. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

随机推荐

  1. 数论 - n元线性同余方程的解法

    note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m       ...

  2. JS 获取 本周、本月、本季度、本年、上月、上周、上季度、去年

    工具类定义: /** * 日期范围工具类 */ var dateRangeUtil = (function () { /*** * 获得当前时间 */ this.getCurrentDate = fu ...

  3. [爬虫学习笔记]用于提取网页中所有链接的 Extractor 模块

            Extractor的工作是从下载的网页中将它包含的所有URL提取出来.这是个细致的工作,你需要考虑到所有可能的url的样式,比如网页中常常会包含相对路径的url,提取的时候需要将它转换 ...

  4. 通过代码的方式完成WCF服务的寄宿工作

    使用纯代码的方式进行服务寄宿 服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境.通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用, ...

  5. AC自动机---病毒侵袭

    HDU 2896 题目网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110773#problem/B Description 当太 ...

  6. Python 学习笔记1

    1.Python2.x与3​​.x版本区别 2.常量与变量 3.if  elif  else 4.注释 5.用户交互 6.字符串拼接 7.文件扩展名 8.缩进 9.运算符 10.while循环 Pyt ...

  7. 研究jdk关于TreeMap 红黑树算法实现

    因为TreeMap的实现方式是用红黑树这种数据结构进行存储的,所以呢我主要通过分析红黑树的实现在看待TreeMap,侧重点也在于如何实现红黑树,因为网上已经有非常都的关于红黑树的实现.我也看了些,但是 ...

  8. Eclipse环境下使用Maven注意事项

    在最新版本的Eclipse Java EE IDE for Web Developers中已经包含Maven 2 在File,New中可以看到Maven Project,新建, 按照步骤一路下来,要求 ...

  9. javascript --- 只继承于原型

    正如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去. 如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了. 毕竟采用new her()方法将her的 ...

  10. 升级sp1后文档无法编辑

    现象: A problem occurred while connecting to the server. If the problem continues, contact your admini ...