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 ...
随机推荐
- unix文件操作函数
1. fopen函数 #include <stdio.h> FILE *fopen(const char *path, const char *mode) 返回:文件顺利打开后,指向该流的 ...
- iOS开发之----常用函数和常数
介绍一下Objective-c常用的函数,常数变量 算术函数 [算术函数] 函数名 说明 int rand() 随机数生成.(例)srand(time(nil)); //随机数初期化int val = ...
- [1]Telerik Extensions for ASP.NET MVC 中文教程(转)
http://demos.telerik.com/aspnet-mvc/ Telerik Extensions for ASP.NET MVC 是Telerik 公司专门针对Asp.net MVC 开 ...
- 1017. A除以B (20)
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...
- Socket Programming in C#--Introduction
This is the second part of the previous article about the socket programming. In the earlier article ...
- windows 80端口被占用
首先关了iis服务,或者把端口换了. 然后关了SQLServer Reporting Service. http://www.2cto.com/os/201505/399603.html
- Unity 协程Coroutine综合测试
using UnityEngine; using System.Collections; using System.Text; public class rotCube : MonoBehaviour ...
- php基础11:运算符
<?php $a = 5; $b = ++$a; echo '$a'.$a; echo "<br>"; echo '$b'.$b; echo "< ...
- TinyFrame框架中的UOW使用方式纠正
我自己的框架中,UOW是可以通过反射提取具体的Repository的,也可以调用Commit方法. 但是正确的应用方式应该是: Using(var uow = new UnitOfWork()) { ...
- 【OpenGL】查看显卡对OpenGL的支持程度
由于开发工作中要用到OpenGL的API进行渲染,公司配的电脑又是集成显卡,所以想知道显卡对OpenGL的支持程度. 下面介绍的方法就解决了这一点. 1.下载安装EVEREST Ultimate Ed ...