HDU 2255 奔小康发大财
Solution:
KM算法
关于KM算法有一篇极好的文档http://www.cse.ust.hk/~golin/COMP572/Notes/Matching.pdf
Implementation:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;
const int N(); int w[N][N];
int Lx[N], Ly[N], slack[N];
bool S[N], T[N];
int match[N];
int n; bool dfs(int u)
{
S[u]=true;
for(int v=; v<=n; v++)
{
if(T[v])
{
continue;
}
int tmp=Lx[u]+Ly[v]-w[u][v];
if(tmp==)
{
T[v]=true;
if(!match[v] || dfs(match[v]))
{
match[v]=u;
return true;
}
}
else
{
slack[v]=min(slack[v], tmp);
}
}
return false;
} void KM()
{
memset(match, , sizeof(match));
memset(Lx, 0x3f, sizeof(Lx));
memset(Ly, 0x3f, sizeof(Ly)); for(int i=; i<=n; i++) //phase
{ for(int i=; i<=n; i++)
{
slack[i]=INT_MAX; //error-prone
}
for(int a; ;)
{
memset(S, , sizeof(S));
memset(T, , sizeof(T));
if(dfs(i)) break;
a=INT_MAX;
for(int j=; j<=n; j++)
{
if(!T[j])
{
a=min(a, slack[j]);
}
}
for(int j=; j<=n; j++)
{
if(S[j])
{
Lx[j]-=a;
}
if(T[j])
{
Ly[j]+=a;
}
else
{
slack[j]-=a;
}
}
}
}
int res=;
for(int i=; i<=n; i++)
{
res+=w[match[i]][i];
}
printf("%d\n", res);
} int main()
{
for(; ~scanf("%d", &n); )
{
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
scanf("%d", w[i]+j);
}
}
KM();
}
}
Error-prone:
我把Lx, Ly, slack都初始化成0x3f3f3f3f,导致dfs中
slack[v]=min(slack[v], tmp);
失灵。
HDU 2255 奔小康发大财的更多相关文章
- HDU 2255 奔小康赚大钱(带权二分图最大匹配)
HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...
- 二分图最大权匹配问题&&KM算法讲解 && HDU 2255 奔小康赚大钱
作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...
- HDU 2255.奔小康赚大钱 最大权匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 2255 奔小康赚大钱 (KM算法 模板题)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 2255 ——奔小康赚大钱——————【KM算法裸题】
奔小康赚大钱 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- [ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间 ...
- HDU - 2255 奔小康赚大钱 KM算法 模板题
HDU - 2255 题意: 分配n所房子给n个家庭,不同家庭对一所房子所需缴纳的钱是不一样的,问你应当怎么分配房子,使得最后收到的钱最多. 思路: KM算法裸题.上模板 #include <i ...
- hdu 2255 奔小康赚大钱 (KM)
奔小康赚大钱Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- oracle用sqlplus创建新用户,不是plsql developer
1.sqlplus /nolog 2.conn /as sysdba 3.alter user system identified by "123456"; 4.alter use ...
- mobileTech
A useful tools or tips list for mobile web application developing 这个项目收集移动端开发所需要的一些资源与小技巧 工具类网站 HTML ...
- 【MySQL】PREPARE 的应用
简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名.在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变 ...
- 房产企业如何借助K2 BPM脱颖而出?
点击这里,查看完整版房地产行业的流程管理解决方案.
- [资源]PHP使用消息队列
利用PHP操作Linux消息队列完成进程间通信 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[原创] Redis队列——PHP操作简单示例 入队操作 <?php $redis = n ...
- C语言 复杂队列(链表队列)
//复杂的队列二 --链表队列 #include<stdio.h> #include<stdlib.h> #define datatype int struct queueli ...
- C# lambda表达式及初始化器
using System;using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1d { c ...
- AE笔记
我想做一个好玩的视频,需要用到AE,写点东西锻炼语言能力,视频教程后续录制到时放链接. 一.合成 拖进项目的视频要新建合成才能加以编辑,新建合成很简单,拖拽你的视频向下到一个类似相片的图标上面就新建成 ...
- pandas 前后行操作
一.前后行满足条件 问题: 各位老师好,我有一个dataframe 产品 数据1 数据2 A 1 2 B 4 5 C 6 3 我想找出比如这一行数据1>数据2 AND 数据1的上一行3 AND ...
- 《图解tcp/ip》读书笔记(一)
我先讲三句话: 一."万物互联的时代到了."我们生活在这样一个互联网急速发展的时代,也许很快就会发现,你能接触到的一切都可以连接到互联网了,电脑.手机这 ...