题目链接:

http://acm.hdu.edu.cn/showproblem.php?

pid=2255

题目大意:

村里要分房子。

有N家老百姓,刚好有N间房子。考虑到每家都要有房住,每家必须分配到一间房子且

仅仅能分配到一间房子。另外, 村长为了得到最大利益,让老百姓对房子进行估价。

比方有3件房子,一

家老百姓能够对第一间出10万,对第二间出2万,对第三间出4万。第二家老百姓能够对第一间出8万,

对第二家出3万,对第三间出5万。那么问题来了:怎么分配,才干使利益最大化。

(村民房子不一定能

分到房,关键看领导分配)。

思路:

建立二分图,一边为N家老百姓,还有一边为N间房子。对老百姓和房子之间估价建立一条有带权边。问

题就转变为了再二分图中找出一个总权值最大的匹配,也就是加权二分图最佳匹配问题。须要用到KM

算法,算法有点复杂,从书上找到一个模板,结果不能执行。。。所以从网上找到一份。

參考博文:http://blog.csdn.net/sdjzujxc/article/details/8604790

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 330;
const int INF = 0xffffff0; int N,NX,NY;
int link[MAXN],lx[MAXN],ly[MAXN],slack[MAXN];
int visx[MAXN],visy[MAXN];
int Map[MAXN][MAXN]; int FindPath(int u)
{
visx[u] = 1;
for(int i = 1; i <= NY; ++i)
{
if(visy[i])
continue;
int temp = lx[u] + ly[i] - Map[u][i];
if(temp == 0)
{
visy[i] = 1;
if(link[i] == -1 || FindPath(link[i]))
{
link[i] = u;
return 1;
}
}
else if(slack[i] > temp)
slack[i] = temp;
}
return 0;
} int KM()
{
memset(ly,0,sizeof(ly));
memset(link,-1,sizeof(link));
for(int i = 1; i <= NX; ++i)
{
lx[i] = -INF;
for(int j = 1; j <= NY; ++j)
if(Map[i][j] > lx[i])
lx[i] = Map[i][j];
} for(int i = 1; i <= NX; ++i)
{
for(int j = 1; j <= NY; ++j)
slack[j] = INF;
while(1)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if(FindPath(i))
break;
int d = INF;
for(int j = 1; j <= NY; ++j)
if(!visy[j] && d > slack[j])
d = slack[j];
for(int j = 1; j <= NX; ++j)
if(visx[j])
lx[j] -= d;
for(int j = 1; j <= NY; ++j)
if(visy[j])
ly[j] += d;
else
slack[j] -= d;
}
}
int res = 0;
for(int i = 1; i <= NY; ++i)
if(link[i] > -1)
res += Map[link[i]][i];
return res;
} int main()
{
int N;
while(~scanf("%d",&N))
{
NX = NY = N;
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
scanf("%d",&Map[i][j]); printf("%d\n",KM());
} return 0;
}

HDU2255 奔小康赚大钱【二分图最佳匹配】的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. CSS中:nth-child和JQuery:eq的区别

    $("li:nth-child(n)")选择器与$("li:eq(n)")选择器的不同之处在于:$("li:eq(n)")选择器只匹配一个元 ...

  2. iOS: 学习笔记, swift扩展

    // // YYExtension.swift // // Created by yao_yu on 14-7-18. // Copyright (c) 2014年 yao_yu. All right ...

  3. Java 高效检查一个数组中是否包含某个值

    如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差 ...

  4. C语言 rand()函数的用法

    rand()(产生随机数) 相关函数 srand() 表头文件 #include<stdlib.h> 定义函数 int rand()(void) 函数说明 rand()会返回一随机数值,范 ...

  5. vbox里面的Ubuntu虚拟机与主机win7之间设置共享文件夹

    有时候我们希望虚拟机和主机之间进行通信,例如传一些文件.那么设置共享文件夹就是一种很好的方式. 这里我的主机是win7系统,vbox里面的虚拟机是Ubuntu. 1.首先安装vbox的VBOXGues ...

  6. 一个漂亮的DIV搜索条

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. easy_install和pip区别

    easy_insall的作用和perl中的cpan, ruby中的gem类似,都提供了在线一键安装模块的傻瓜方便方式,而pip是easy_install的改进版, 提供更好的提示信息,删除packag ...

  8. SQL*Net more data from client

    SQL*Net more data from client The server is waiting on the client to send more data to its client sh ...

  9. Duplex Services (Msdn)

    Duplex Services from msdn A duplex service contract is a message exchange pattern in which both endp ...

  10. (转载)Mac和iOS开发资源汇总—更新于2013-07-19

    (转载)http://beyondvincent.com/2013/07/18/resources-for-mac-and-ios-developers/ 小引 本文主要汇集一些苹果开发的资源,会经常 ...