HDU2255 奔小康赚小钱钱(二分图-最大带权匹配)
这可是一件大事,关系到人民的住房问题啊。村里共有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
题解:二分图的最大带权匹配模板题:理解匈牙利算法(或KM算法)模板即可过;
参考代码(KM算法优化后的,时间复杂度 O(n^3),可以作为模板):
#include<bits/stdc++.h>
using namespace std;
const int MAXN = ;
const int INF = 0x3f3f3f3f;
int love[MAXN][MAXN];
int ex_girl[MAXN],ex_boy[MAXN];
bool vis_girl[MAXN],vis_boy[MAXN];
int match[MAXN],slack[MAXN];
int N; bool dfs(int girl)
{
vis_girl[girl]=true;
for(int boy=;boy<N;++boy)
{
if(vis_boy[boy]) continue;
int gap=ex_girl[girl]+ex_boy[boy]-love[girl][boy];
if(gap == )
{
vis_boy[boy] = true;
if (match[boy] == - || dfs( match[boy] ))
{
match[boy] = girl;
return true;
}
}
else slack[boy] = min(slack[boy], gap);
}
return false;
} int KM()
{
memset(match,-,sizeof match);
memset(ex_boy,,sizeof ex_boy);
for(int i=;i<N;++i)
{
ex_girl[i]=love[i][];
for(int j=;j<N;++j) ex_girl[i]=max(ex_girl[i],love[i][j]);
}
for(int i=;i<N;++i)
{
fill(slack,slack+N,INF);
while()
{
memset(vis_girl,false,sizeof vis_girl);
memset(vis_boy,false,sizeof vis_boy);
if(dfs(i)) break;
int d=INF;
for(int j=;j<N;++j) if(!vis_boy[j]) d=min(d,slack[j]);
for(int j=;j<N;++j)
{
if(vis_girl[j]) ex_girl[j]-=d;
if(vis_boy[j]) ex_boy[j]+=d;
else slack[j]-=d;
}
}
}
int res=;
for(int i=;i<N;++i) res+=love[match[i]][i];
return res;
} int main()
{
while(~scanf("%d", &N))
{
for(int i = ; i < N; ++i)
for(int j = ; j < N; ++j)
scanf("%d", &love[i][j]);
printf("%d\n", KM());
}
return ;
}
HDU2255 奔小康赚小钱钱(二分图-最大带权匹配)的更多相关文章
- hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)
/** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) ...
- Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...
- HDU2255 奔小康赚大钱【二分图最佳匹配】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...
- hdu-2255.奔小康赚大钱(最大权二分匹配)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU2255 奔小康赚大钱 —— 二分图最大权匹配 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) ...
- HDU2255 奔小康赚大钱 (最大权完美匹配) 模板题【KM算法】
<题目链接> 奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊 ...
- [hdu2255]奔小康赚大钱(二分图最优匹配、KM算法)
题目大意:求二分图的最优匹配(首先数目最大, 其次权值最大). 解题关键:KM算法 复杂度:$O(n^3)$ #include<cstdio> #include<cstring> ...
- HDU2255 奔小康赚大钱 【KM算法】
题意: 每个人对不同房有不同出价,就是就是怎样匹配卖房让收入达到最大. 思路: 建立二分图,一边为N家老百姓,还有一边为N间房子.对老百姓和房子之间估价建立一条有带权边.问题就转变为了再二分图中找出一 ...
- hdu-2255 奔小康赚大钱---KM模板
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2255 题目大意: Problem Description 传说在遥远的地方有一个非常富裕的村落,有一 ...
随机推荐
- deepin 15.11添加应用启动图标
以postman为例(路径要按需修改) 1.建立软链接 sudo ln -s /home/lixing/software/Postman/Postman /usr/bin/postman 前面地址为安 ...
- Linux 解决ntfs文件系统问题,支持外设(U盘等设备)的即插即拔
# rpm -q fuse //查看这个软件有没有安装,一般安装系统都会装(最小安装例外) fuse-2.9.2-10.el7.x86_64 # yum -y install gcc # wget h ...
- 【笔记】nginx部署静态网站
安装nginx 本地到官网下载,然后把压缩包传到服务器上 安装三个依赖 apt-get install libpcre3 libpcre3-dev apt-get install zlib1g-dev ...
- pandas的使用(3)
pandas的使用(3)
- nyoj 64-鸡兔同笼 (解二元一次方程)
64-鸡兔同笼 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:26 submit:58 题目描述: 已知鸡和兔的总数量为n,总腿数为m.输入n和m, ...
- 【Flume】Flume基础之安装与使用
1.Flume简介 (1) Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集.聚集.移动的服务,Flume只能在Unix环境下运行. (2) Flume基于流式架构,容错性强, ...
- shodan 文档学习笔记
Table of Contents 1. Introduction 1.1. All About the Data 1.2. Data Collection 1.3. SSL in Depth 1.3 ...
- 标准库flag和cobra
package main import "flag" var b bool var q *bool func init(){ var b bool //方式一 flag.Type( ...
- Magicodes.IE之导入学生数据教程
基础教程之导入学生数据 说明 本教程主要说明如果使用Magicodes.IE.Excel完成学生数据的Excel导入. 要点 本教程使用Magicodes.IE.Excel来完成Excel数据导入 需 ...
- SQL SERVER中SELECT和SET赋值相同点与不同点
SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同. 1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是.这也是SET方式 ...