奔小康赚大钱

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

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
 
Recommend
lcy

抱着试一试的心态读了一下题,果然是裸模版题...敲了一波就过了

 /*************************************************************************
> File Name: hdu-2255.奔小康赚大钱.cpp
> Author: CruelKing
> Mail: 2016586625@qq.com
> Created Time: 2019年09月04日 星期三 00时01分32秒
本题思路:最大权完备匹配裸题
************************************************************************/ #include <cstdio>
#include <cstring>
using namespace std; const int maxn = + , inf = 0x3f3f3f3f;
int n, g[maxn][maxn];
int linker[maxn], lx[maxn], ly[maxn], slack[maxn];
bool visy[maxn], visx[maxn]; bool dfs(int x) {
visx[x] = true;
for(int y = ; y <= n; y ++) {
if(visy[y]) continue;
int temp = lx[x] + ly[y] - g[x][y];
if(temp == ) {
visy[y] = true;
if(linker[y] == - || dfs(linker[y])) {
linker[y] = x;
return true;
}
}
else if(slack[y] > temp) slack[y] = temp;
}
return false;
} int km() {
memset(linker, -, sizeof linker);
memset(ly, , sizeof ly);
for(int i = ; i <= n; i ++) {
lx[i] = -inf;
for(int j = ; j <= n; j ++)
if(g[i][j] > lx[i]) lx[i] = g[i][j];
}
for(int x = ; x <= n; x ++) {
for(int i = ; i <= n; i ++)
slack[i] = inf;
while(true) {
memset(visx, false, sizeof visx);
memset(visy, false, sizeof visy);
if(dfs(x)) break;
int d = inf;
for(int i = ; i <= n; i ++)
if(!visy[i] && d > slack[i]) d = slack[i];
for(int i = ; i <= n; i ++)
if(visx[i]) lx[i] -= d;
for(int i = ; i <= n; i ++) {
if(visy[i]) ly[i] += d;
else slack[i] -= d;
}
}
}
int res = ;
for(int i = ; i <= n; i ++)
if(linker[i] != -) res += g[linker[i]][i];
return res;
} int main() {
while(~scanf("%d", &n)) {
for(int i = ; i <= n; i ++) {
for(int j = ; j <= n; j ++) {
scanf("%d", &g[i][j]);
}
}
printf("%d\n", km());
}
return ;
}

hdu-2255.奔小康赚大钱(最大权二分匹配)的更多相关文章

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

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

  2. hdu 2255 奔小康赚大钱 最大权匹配KM

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python类和self解析

    在介绍Python的self用法之前,先来介绍下Python中的类和实例……我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用 ...

  2. font-awesome样式只显示方框

    这是一个踩过的坑:使用font-awesome中的css样式库时,比如fa-user-circle-o,显示的不是一个用户图标,而是一个方框. 怎么回事呢? 进入css文件,发现: 咦,这些文件呢?我 ...

  3. 关于js节流函数throttle和防抖动debounce

    废话不多说,直奔主题. 什么是throttle和debounce? 这两个方法的主要目的多是用于性能优化.最常见的应用尝尽就是在通过监听resize.scroll.mouseover等事件时候的性能消 ...

  4. React Autocomplete(自动完成输入)示例教程

    React Autocomplete示例教程是今天的主题.在现代Web开发中,使用React改善用户体验是很容易.自动完成的概念很简单.它是基于用户输入的建议列表.然后,用户可以按Enter键以完成短 ...

  5. margin与padding的区别是什么?

    margin与padding的区别是什么? 目录 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考文献 8.更多讨论 1.背景介绍 什么是margin 什么 ...

  6. 【leetcode】1171. Remove Zero Sum Consecutive Nodes from Linked List

    题目如下: Given the head of a linked list, we repeatedly delete consecutive sequences of nodes that sum ...

  7. 最小生成树(Kruskal算法)模板

    #include<iostream> #include<algorithm> using namespace std; ],n; struct node { int u,v,v ...

  8. Go简易分布式对象存储 合并文件的所有分块为一个文件

    项目 项目地址: https://github.com/Draymonders/cloud 欢迎大家Watch or Star 缘由 由于项目中对大文件进行5MB为一个分块上传(多线程,提升上传效率) ...

  9. PG_CONFIG-NOTFOUND

  10. Linux shell - ps,wc命令用法

    例1. 查看Oracle数据库活动进程LOCAL=NO,输出行数 oracle@sha> ps -ef|grep LOCAL=NO|wc -l 15 解释:ps -ef是查看所有的进程的 然后用 ...