奔小康赚大钱

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

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

Recommend

lcy

分析:

KM算法就是在匈牙利算法的基础上加了权值的束缚,为了达到权值和最大或者最小,就不能简单的去算边数

1.首先找到所有居民愿意花钱最多的那个房子,同时调节 lx,ly数组,使得权值和最大,或者当要松弛的时候,使得本来最大的矛盾权值和,尽可能的损失少一些,来得到满足条件的最大权值和

2.在 lx[x]+ly[y]=w[x][y]条件下进行匈牙利算法,既可以让居民住他花钱最多的房子,又可以在多居民抢一个房子的时候,用它来得到该居民到其他房子的松弛量(即该居民到其它房子 比 到这个用钱最多的房子 愿意花的钱数上差的值。)

那么我们就要把 发生矛盾的居民到 其它房子的松弛量  的最小值求出来。再用它去松弛,就可以让原本矛盾的最大权值和,损失最小而得到满足条件的最大权值和!

对于每个居民有4个基本问题:

1.这个房子访问过没有?

2.这个房子能不能满足他的条件

3.这个房子是否被别人住了

4.被别人住了能不能得到调配

//HDU2255
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 310
#define INF 0x3f3f3f3f
#define clr(x)  memset(x,0,sizeof(x))
int w[maxn][maxn];//w[i][j]表示i到j的权值
int lx[maxn],ly[maxn];//同时调节两个数组,使得权值和最大
int n;
//n1,n2为二分图的顶点集,其中x属于n1,y属于n2
//link记录n2中的点y在n1中所匹配的x点的编号
int link[maxn];
int slack[maxn];//松弛操作
int visx[maxn],visy[maxn];
bool dfs(int x)
{visx[x]=1;//得到发生矛盾的居民集合//对于这个居民,每个房子都试一下,找到就退出for(int y=1;y<=n;y++){if(visy[y]) continue;//不需要重复访问int t=lx[x]+ly[y]-w[x][y];//这个条件下使用匈牙利算法if(t==0)//标志这个房子可以给这个居民{visy[y]=1;
//这个房子没人住或者可以让住着个房子的人去找另外的房子住if(link[y]==0||dfs(link[y])){link[y]=x;return 1;//可以让这位居民住进来}}else if(slack[y]>t)//否则这个房子不能给这位居民slack[y]=t;}return 0;
}
int KM()
{clr(lx);clr(ly);clr(link);//首先把每个居民出的钱最多的那个房子给他for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(lx[i]<w[i][j])lx[i]=w[i][j];//在满足上述条件之后,给第i位居民分配房子for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)slack[j]=INF;//松弛量while(1)//直到给这个居民找到房子为止{clr(visx);clr(visy);if(dfs(i))  break;//找到房子,就跳出循环int d=INF;for(int k=1;k<=n;k++)if(!visy[k]&&d>slack[k])d=slack[k];//找到最小松弛量for(int k=1;k<=n;k++)//松弛操作,使发生矛盾的居民有更多选择{if(visx[k]) lx[k]-=d;//将矛盾居民的要求降低,使发生矛盾的居民有更多if(visy[k]) ly[k]+=d;//使发生矛盾的房子在下一个子图,保持矛盾}}}int ans=0;for(int i=1;i<=n;i++)ans+=w[link[i]][i];return ans;
}
int main()
{while(~scanf("%d",&n)){clr(w);//每个案例都重置为0for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&w[i][j]);//输入每条边的权值printf("%d\n",KM());}return 0;
}

HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法相关推荐

  1. KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home

    最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...

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

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

  3. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...

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

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

  5. HDU - 2255 奔小康赚大钱(二分图最大权匹配+KM)

    题目链接:点击查看 题目大意:中文题目,简单来说就是n个人和n个房子最大匹配,需要一一对应并且满足权值和最大 题目分析:二分图的完备匹配,条件完全符合KM算法的局限性,直接套模板即可,后续学习费用流( ...

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

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

  7. HDUOJ 2255 奔小康赚大钱

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

  8. 二分图最佳匹配 KM算法 Hdu2255奔小康赚大钱 + Poj 3565 Ants

    2014-10-4 更新 在最下面增加了基于邻接表的模板 理论:http://blog.sina.com.cn/s/blog_691ce2b701016reh.html http://philosci ...

  9. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

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

最新文章

  1. (解释)单片机与各种外围设备(Flash、RAM、网络控制器、A/D、传感器、MCU等)进行直接串行通信通常采用( D)接口
  2. golang中的对称加密
  3. 泛函分析1-线性空间
  4. python获取当前路径下所有文件
  5. python超市管理系统_控制台超市系统(Python)
  6. 华为免费虚拟服务器,免费试用虚拟服务器
  7. ajax修改按钮的html值,ajax - 在yii 1中使用ajax根据选定的单选按钮选项更新html字段值 - 堆栈内存溢出...
  8. 这可能是最适合C++学习者的书单
  9. linux系统能装什么显卡,Linux系统下安装显卡驱动
  10. game module 停止运行_详解流量复制解决方案--NGINX的ngx_http_mirror_module模块实现
  11. tm是什么域名_天猫入驻条件门槛是什么意思?企业入驻天猫详细解析
  12. 公司服务器文档管理制度,文件服务器管理制度
  13. 在线图片坐标拾取工具
  14. virtualbox安装增强功能时【未能加载虚拟光盘】
  15. html怎么修改像素,PS怎么修改像素又不改变尺寸?
  16. 5款优秀的文档管理系统
  17. 关于word粘贴图片显示不全的解决办法
  18. origin8.0 绘图学习笔记
  19. 【JAVA】Java 内存模型中的 happen-before
  20. Ubuntu更改密码及hostname步骤

热门文章

  1. freemark静态页面中文乱码
  2. 转自知乎大神----JS 的 new 到底是干什么的?
  3. CTRL+SHIFT
  4. 技术分享(持续更新)
  5. sign python_python机器学习
  6. Java自动拆装箱面试_跟王老师学泛型(二):Java自动装箱与拆箱
  7. linux 内核维护,Linux 4.18内核系列生命周期结束:用户需尽快更新内核
  8. tensorflow 数据格式
  9. access如何查询两张表的内容_为什么可以的话,不要使用星号 *,而是相应的字段名来进行查询 MySQL内连接如何选择驱动表
  10. Map的Value值转换为List集合