题面

  1. 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。
  2. 这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。
  3. 另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(当然是在他们的经济范围内).现在这个问题就是村领导怎样分配房子才能使收入最大.(村民即使有钱购买一间房子但不一定能买到,要看村领导分配的).

Input

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

Output

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

Sample Input

  1. 2
  2. 100 10
  3. 15 23

Sample Output

  1. 123

题解

学习了KM算法

解决了这一道基本的模板题。

KM算法用来求二分图的最大权匹配。

具体的过程我这个小蒟蒻并讲不清

这里链接一个大佬的blog,对于KM算法的过程讲述的十分清楚

http://www.cnblogs.com/wenruo/p/5264235.html

接下来我自己直接粘贴代码了

其他的都在注释里面写着

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. const int MAX=310;
  9. const int INF=200000000;
  10. int ex1[MAX];//某一侧的期望值
  11. int ex2[MAX];//另一侧的期望值
  12. int e[MAX][MAX];//存价格
  13. int match[MAX];//保存匹配
  14. bool vis1[MAX];//某一侧是否访问过
  15. bool vis2[MAX];//另一侧是否访问过
  16. int n;
  17. int slack[MAX];
  18. bool DFS(int x)
  19. {
  20. vis1[x]=true;//标记访问
  21. for(int i=1;i<=n;++i)
  22. {
  23. if(vis2[i])continue;//在这一轮已经被匹配过
  24. int gap=ex1[x]+ex2[i]-e[x][i];//计算是否满足条件
  25. if(gap==0)//正好满足条件
  26. {
  27. vis2[i]=true;//标记访问过
  28. if(!match[i]||DFS(match[i]))//如果没有配对或者可以更改配对
  29. {
  30. match[i]=x;
  31. return true;
  32. }
  33. }
  34. else//不能满足要求
  35. {
  36. slack[i]=min(slack[i],gap);//差距的期望值要更新
  37. }
  38. }
  39. return false;
  40. }
  41. void KM()
  42. {
  43. memset(match,0,sizeof(match));//清空匹配
  44. for(int i=1;i<=n;++i)
  45. {
  46. ex1[i]=e[i][1];
  47. for(int j=2;j<=n;++j)
  48. ex1[i]=max(ex1[i],e[i][j]);//初始化期望值为可以匹配的最大的权值
  49. }
  50. memset(ex2,0,sizeof(ex2));//另一侧的期望值初始化为0
  51. for(int i=1;i<=n;++i)
  52. {
  53. for(int j=1;j<=n;++j)
  54. slack[j]=INF;//需要增长的最小期望值
  55. while(233)
  56. {
  57. memset(vis1,0,sizeof(vis1));
  58. memset(vis2,0,sizeof(vis2));
  59. if(DFS(i))break;//匹配成功
  60. int d=INF;//可以降低的最小期望值
  61. for(int j=1;j<=n;++j)//找到可以减去的最小期望值
  62. if(!vis2[j])
  63. d=min(d,slack[j]);
  64. for(int j=1;j<=n;++j)//一侧减少期望值
  65. if(vis1[j])
  66. ex1[j]-=d;
  67. for(int j=1;j<=n;++j)//另一侧期望值增加
  68. if(vis2[j])
  69. ex2[j]+=d;
  70. else
  71. slack[j]-=d;
  72. }
  73. }
  74. }
  75. int main()
  76. {
  77. while(scanf("%d",&n)!=EOF)
  78. {
  79. for(int i=1;i<=n;++i)
  80. for(int j=1;j<=n;++j)
  81. scanf("%d",&e[i][j]);
  82. int ans=0;
  83. KM();
  84. for(int i=1;i<=n;++i)
  85. ans+=e[match[i]][i];
  86. printf("%d\n",ans);
  87. }
  88. }

【HDU2255】奔小康赚大钱的更多相关文章

  1. hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)

    /** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) ...

  2. hdu-2255.奔小康赚大钱(最大权二分匹配)

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

  3. HDU2255 奔小康赚大钱 (最大权完美匹配) 模板题【KM算法】

    <题目链接> 奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊 ...

  4. Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)

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

  5. HDU2255 奔小康赚大钱 —— 二分图最大权匹配 KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    ...

  6. HDU2255 奔小康赚大钱【二分图最佳匹配】

    题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...

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

    题意: 每个人对不同房有不同出价,就是就是怎样匹配卖房让收入达到最大. 思路: 建立二分图,一边为N家老百姓,还有一边为N间房子.对老百姓和房子之间估价建立一条有带权边.问题就转变为了再二分图中找出一 ...

  8. hdu2255 奔小康赚大钱,最大权匹配,KM算法

    点击打开链接 最大权匹配 KM算法 算法步骤: 设顶点Xi的顶标为a[i],顶点Yi的顶标为b[i] ⅰ.初始时.a[i]为与Xi相关联的边的最大权值.b[j]=0.保证a[i]+b[j]>=w ...

  9. hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...

  10. [hdu2255]奔小康赚大钱(二分图最优匹配、KM算法)

    题目大意:求二分图的最优匹配(首先数目最大, 其次权值最大). 解题关键:KM算法 复杂度:$O(n^3)$ #include<cstdio> #include<cstring> ...

随机推荐

  1. php 处理并发问题

    对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了 在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制. 方案一:使用文件锁排它锁 f ...

  2. PHP实现session对象封装

    <?php class Session { private $db; // 设置数据库变量 private $expiry = 3600; // 设置Session失效时间 public fun ...

  3. PHPStorm 常用 设置配置 和快捷键大全 Win/Mac

    [转自 http://blog.csdn.net/fenglailea/article/details/53350080] PHPStorm 下载及主题样式下载 http://www.lanmps.c ...

  4. CentOS 7 NetworkManager Keeps Overwriting /etc/resolv.conf

    In CentOS or Red Hat Enterprise Linux (RHEL) 7, you can find your /etc/resolv.conf file, which holds ...

  5. js的call和apply拾遗

    一.产生背景 1. JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念 2.正因为上下文的不同所以call 和 apply 都是为了改变某个函数运行 ...

  6. npm注意事项(附带Vue-cli安装)

    下载完nodeJS后,可选择更改配置目录 1.npm config set prefix "D:\node\node-global"<!--配置全局安装目录--> 2. ...

  7. Redis限制在规定时间范围内登陆错误次数限制

    在博客里之前有过一篇文章是 <PHP结合Redis来限制用户或者IP某个时间段内访问的次数>,这篇文章的思路也是一样的.看下代码吧 //登录错误次数校验 $key = "logi ...

  8. C 语言中模板的几种实现方式

    简单宏定义实现 简单宏定义 - 方式一 这种方式将主要实现部分放在一个宏定义中,利用字符替换的方式实现不同 type 的运算,详细思路见代码: simple_macro_1.c #include &l ...

  9. 关于 Java 面试,你应该准备这些知识点

    来源:占小狼, www.jianshu.com/p/1b2f63a45476 马老师说过,员工的离职原因很多,只有两点最真实: 钱,没给到位 心,受委屈了 当然,我是想换个平台,换个方向,想清楚为什么 ...

  10. Ironic几种不同的场景下的网络拓扑

    最近帮领导做了几页ppt,总结几种场景下ironic管理物理机网络的网络拓扑,简单做成一份文章记录下.只是方便自己记忆,没有认真修改.如果对ironic有一定了解,可以看下,加深理解. 1. vlan ...