题目大意:

给定每一个人能支付的房子价值,每个人最多且必须拥有一套房子,问最后分配房子可得到的最大收益

抄了个别人的KM模板,就这样了。。。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 305
const int INF = 0x7fffffff;
int n , nx , ny;
int slack[N] , lx[N] , ly[N] , linker[N] , w[N][N] , visx[N] , visy[N]; int dfs(int u)
{
visx[u] = ;
for(int y= ; y<=ny ; y++){
if(visy[y]) continue;
int tmp = lx[u]+ly[y]-w[u][y];
if(tmp == ){
visy[y]=;
if(linker[y]==- || dfs(linker[y])){
linker[y]=u;
return ;
}
}
else if(slack[y]>tmp) slack[y] = tmp;
}
return ;
} int KM()
{
memset(linker , - , sizeof(linker));
memset(ly , , sizeof(ly));
//lx初始化为最大的边长
for(int i= ; i<=nx ; i++)
{
lx[i] = -INF;
for(int j= ; j<=ny ; j++)
lx[i] = max(lx[i] , w[i][j]);
}
for(int i= ; i<=nx ; i++){
for(int j= ; j<=ny ; j++){
slack[j] = INF;
}
while(true){
memset(visx , , sizeof(visx));
memset(visy , , sizeof(visy));
if(dfs(i)) break; //若找不到增广路,就需要改变一下标号
int a = INF;
for(int k= ; k<=ny ; k++)
if(!visy[k]&&a>slack[k])
a = slack[k];
for(int k= ; k<=nx ; k++)
if(visx[k])
lx[k]-=a;
for(int k= ; k<=nx ; k++)
if(visy[k]) ly[k]+=a;
else slack[k]-=a;
}
}
int res = ;
for(int i= ; i<=ny ; i++)
if(linker[i]!=-)
res+=w[linker[i]][i];
return res;
} int main()
{
// freopen("in.txt" , "r" , stdin);
while(~scanf("%d" , &n))
{
for(int i= ; i<=n ; i++)
for(int j= ; j<=n ; j++) scanf("%d" , &w[i][j]);
nx = n , ny = n;
int ans = KM();
printf("%d\n" , ans);
}
return ;
}

HDU 2255 二分图最佳匹配 模板题的更多相关文章

  1. HDU 2255 二分图最佳匹配

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

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

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

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

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

  4. hdu3488 Tour 拆点+二分图最佳匹配

    In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way r ...

  5. hdu 2255 二分图最大权匹配 *

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

  6. hdu 2063 过山车(二分图最佳匹配)

    经典的二分图最大匹配问题,因为匈牙利算法我还没有认真去看过,想先试试下网络流的做法,即对所有女生增加一个超级源,对所有男生增加一个超级汇,然后按照题意的匹配由女生向男生连一条边,跑一个最大流就是答案( ...

  7. HDU 2426 Interesting Housing Problem(二分图最佳匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2426 题意:每n个学生和m个房间,现在要为每个学生安排一个房间居住,每个学生对于一些房间有一些满意度,如果满意度 ...

  8. UOJ#80 二分图最大权匹配 [模板题]

    从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...

  9. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

随机推荐

  1. Spring Bean配置默认为单实例 pring Bean生命周期

    Bean默认的是单例的. 如果不想单例需要如下配置:<bean id="user" class="..." scope="singleton&q ...

  2. 【服务器环境搭建-Centos】jdk的安装

    1.查看是否已安装openjdk 使用rpm命令查看是否已安装openjdk[root@linuxidc ~]# rpm -qa | grep java tzdata-java-2012c-.el6. ...

  3. (Clob的写入和读取-java)更新数据库报错:SQL Error: 1461, SQLState: 72000 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

    原 因:某一个字段本为varchar2(1024),但是实际要插入的值超过varchar2允许的最大长度4000时,oracle自动将该字段值转化为Long类型,然后提示插入操作失败. 解决办法: 1 ...

  4. 转!!EL表达式大全

    EL表达式      1.EL简介 1)语法结构        ${expression} 2)[]与.运算符      EL 提供.和[]两种运算符来存取数据.      当要存取的属性名称中包含一 ...

  5. commonJS — 自定义事件处理(for CustomEvent)

    for CustomEvent github: https://github.com/laixiangran/commonJS/blob/master/src/forCustomEvent.js 代码 ...

  6. C/C++中float和double的存储结构

    int main (int argc, char **argv) { float a = 1.0f; cout <<"(int&)a = "<<(i ...

  7. python 练习 29

    Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. 以下实例在变量赋值时 Number 对象将被创建: v ...

  8. python 练习 26

    Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句. br ...

  9. python 练习 16

    #!/usr/bin/python # -*- coding: UTF-8 -*- import time myD = {1: 'a', 2: 'b'} for key, value in dict. ...

  10. 在ArcMap 10.3中创建和编辑数据

    在ArcMap 10.3中创建和编辑数据 .......待补充 新建 创建一个新文件((Points, Polylines, and Polygons/点.线.多边形)