传送门

Solution:

KM算法

关于KM算法有一篇极好的文档http://www.cse.ust.hk/~golin/COMP572/Notes/Matching.pdf

Implementation:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <climits>
  5. using namespace std;
  6. const int N();
  7.  
  8. int w[N][N];
  9. int Lx[N], Ly[N], slack[N];
  10. bool S[N], T[N];
  11. int match[N];
  12. int n;
  13.  
  14. bool dfs(int u)
  15. {
  16. S[u]=true;
  17. for(int v=; v<=n; v++)
  18. {
  19. if(T[v])
  20. {
  21. continue;
  22. }
  23. int tmp=Lx[u]+Ly[v]-w[u][v];
  24. if(tmp==)
  25. {
  26. T[v]=true;
  27. if(!match[v] || dfs(match[v]))
  28. {
  29. match[v]=u;
  30. return true;
  31. }
  32. }
  33. else
  34. {
  35. slack[v]=min(slack[v], tmp);
  36. }
  37. }
  38. return false;
  39. }
  40.  
  41. void KM()
  42. {
  43. memset(match, , sizeof(match));
  44. memset(Lx, 0x3f, sizeof(Lx));
  45. memset(Ly, 0x3f, sizeof(Ly));
  46.  
  47. for(int i=; i<=n; i++) //phase
  48. {
  49.  
  50. for(int i=; i<=n; i++)
  51. {
  52. slack[i]=INT_MAX; //error-prone
  53. }
  54. for(int a; ;)
  55. {
  56. memset(S, , sizeof(S));
  57. memset(T, , sizeof(T));
  58. if(dfs(i)) break;
  59. a=INT_MAX;
  60. for(int j=; j<=n; j++)
  61. {
  62. if(!T[j])
  63. {
  64. a=min(a, slack[j]);
  65. }
  66. }
  67. for(int j=; j<=n; j++)
  68. {
  69. if(S[j])
  70. {
  71. Lx[j]-=a;
  72. }
  73. if(T[j])
  74. {
  75. Ly[j]+=a;
  76. }
  77. else
  78. {
  79. slack[j]-=a;
  80. }
  81. }
  82. }
  83. }
  84. int res=;
  85. for(int i=; i<=n; i++)
  86. {
  87. res+=w[match[i]][i];
  88. }
  89. printf("%d\n", res);
  90. }
  91.  
  92. int main()
  93. {
  94. for(; ~scanf("%d", &n); )
  95. {
  96. for(int i=; i<=n; i++)
  97. {
  98. for(int j=; j<=n; j++)
  99. {
  100. scanf("%d", w[i]+j);
  101. }
  102. }
  103. KM();
  104. }
  105. }

Error-prone:

我把Lx, Ly, slack都初始化成0x3f3f3f3f,导致dfs中

  1. slack[v]=min(slack[v], tmp);

失灵。

HDU 2255 奔小康发大财的更多相关文章

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

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

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

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

  3. HDU 2255.奔小康赚大钱 最大权匹配

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

  4. HDU 2255 奔小康赚大钱 (KM算法 模板题)

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

  5. HDU 2255 ——奔小康赚大钱——————【KM算法裸题】

    奔小康赚大钱 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

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

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

  7. [ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)

    奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间 ...

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

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

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

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

随机推荐

  1. html5压缩图片并上传

    手机端图片有很大的,上传的时候很慢,这时候就要压缩一下了,有一个开源的js可以压缩图片的大小,开源地址如下:https://github.com/think2011/localResizeIMG3 代 ...

  2. ralitive absolute

    3.relative与absolute的主要区别: 首先,是上面已经提到过的在正常流中的位置存在与否. 其次,relative定位的层总是相对于其最近的父元素,无论其父元素是何种定位方式.如图3: 图 ...

  3. POJ 1125 Stockbroker Grapevine

    Stockbroker Grapevine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33141   Accepted: ...

  4. GIT在Linux上的安装和使用简介

    GIT最初是由Linus Benedict Torvalds为了更有效地管理Linux内核开发而创立的分布式版本控制软件,与常用的版本控制工具如CVS.Subversion不同,它不必服务器端软件支持 ...

  5. C语言 百炼成钢18

    //题目52:用递归打印以下图形 //* //*.*. //*..*..*.. //*...*...*...*... //*....*....*....*....*.... #include<s ...

  6. Uploadify v3.2.1 属性、事件、方法说明

    一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass " 按钮样式 buttonCur ...

  7. Vim中split的使用方法

    Vim中split的使用方法 一.作用 用split可以显示两个不同的文件:或者同时显示一个文件的两个不同地方:又或者并排比较两个文件.这一切都可以通过分割窗口实现.如下图,左边的两个窗口是mytoo ...

  8. 基于EventAggregator的事件发布及订阅

    EventAggregator简介 EventAggregator是Prism中专门处理ViewModel与ViewModel之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方 ...

  9. python数字图像处理(2):图像的读取、显示与保存

    skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的.为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用. 引入skimage模块可用: from sk ...

  10. 『随笔』Socket 链接 必须 上下行 同时使用

    结论: > Socket 理论上 支持 只上行,或者 只下行. > 心跳包 必须是 上下行的 —— 心跳包请求(上行) - 心跳包响应(下行). > 如果 长时间 只有单向链接(只发 ...