题目链接

奔小康赚大钱

Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7350 Accepted Submission(s): 3263

Problem Description##

传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。

这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。

另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(当然是在他们的经济范围内).现在这个问题就是村领导怎样分配房子才能使收入最大.(村民即使有钱购买一间房子但不一定能买到,要看村领导分配的).

Input

输入数据包含多组测试用例,每组数据的第一行输入n,表示房子的数量(也是老百姓家的数量),接下来有n行,每行n个数表示第i个村名对第j间房出的价格(n<=300)。

Output

请对每组数据输出最大的收入值,每组的输出占一行。

Sample Input

2

100 10

15 23

Sample Output

123

Source##

HDOJ 2008 Summer Exercise(4)- Buffet Dinner

分析:建图,做最大权匹配。###

KM算法:

我的理解:

其实初始化最大,但是不一定能够做到刚好匹配,于是,用到了松弛,和顶标的概念。slack是松弛函数,利用不在交错树中的Y顶点stack最小的一个,去修改顶标来松弛,直到可以加入更多的边。

Code(C++):##

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

HDU(2255),KM算法,最大权匹配的更多相关文章

  1. HDU 2255 KM算法 二分图最大权值匹配

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

  2. hdu 3435(KM算法最优匹配)

    A new Graph Game Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. hdu 2448(KM算法+SPFA)

    Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

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

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

  5. hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))

    Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. HDU 1533 KM算法(权值最小的最佳匹配)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

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

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题: #include <stdio.h> #include <a ...

  8. hdu 4862 KM算法 最小K路径覆盖的模型

    http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...

  9. HDU 2255 & KM模板

    题意: 一张完备二分图求最优完备匹配. SOL: 这题就不讲什么sol了...毕竟是裸的KM,不会的话可以看老人家的大白鼠,一些问题看代码注释.讲讲经历(悲惨的经历) 刚打完,自信地交上去发现MLE. ...

  10. P - 奔小康赚大钱 - hdu 2255(带权值的匹配)

    分析:这是一个KM的模板题,也就不多说了,KM最复杂的情况都能过,下面是没有优化过的代码: ****************************************************** ...

随机推荐

  1. 系统性能调优CPU与内存

    CPU相关术语 处理器:插到系统插槽或者处理器版上的物理芯片,以核或者硬件线程的方式包含了一块或者多块CPU. 核:一颗多核处理器上的一个独立CPU实例.核的使用时处理器扩展的一种方式,有称为芯片级多 ...

  2. Leetcode: Flatten Nested List Iterator

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  3. 解决Xamarin 生成时出现 “aapt.exe”已退出,代码为 1。错误问题

    项目中添加的资源或项目文件的名称不能包含 空格 横线 特殊符号 或者 Android关键字 等

  4. for穷举

    穷举:把所有可能的情况都走一遍,使用if条件筛选出来满足的条件的情况.(把所有的可能性都列举一边) 迭代:从初始情况按照规律不断求解中间情况,最终推导出结果.f foreach  专为数组定义的一种命 ...

  5. C#: 数据绑定

    数据绑定是分离UI和后端主逻辑程序的一种好的办法.这里总结下TextBox, Label, ComboBox, ListBox, DataGridView的数据绑定 数据绑定都是通过DB来和UI控件的 ...

  6. 如何使用highmaps制作中国地图

    如何使用highmaps制作中国地图 文章目录 Highmaps 所需文件 地图初始化代码 highmaps 渲染讲解 highmaps 中国各城市坐标的json文件 highmaps 线上DEMO ...

  7. fackbook的Fresco (FaceBook推出的Android图片加载库-Fresco)

    [Android开发经验]FaceBook推出的Android图片加载库-Fresco   欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件 ...

  8. paper 86:行人检测资源(上)综述文献【转载,以后使用】

    行人检测具有极其广泛的应用:智能辅助驾驶,智能监控,行人分析以及智能机器人等领域.从2005年以来行人检测进入了一个快速的发展阶段,但是也存在很多问题还有待解决,主要还是在性能和速度方面还不能达到一个 ...

  9. paper 55:图像分割代码汇总

    matlab 图像分割算法源码 1.图像反转 MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8( ...

  10. form文件上传,防止页面刷新

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>文件上传 ...