HDU2255(带权二分图的最大匹配)
题目:奔小康赚大钱
KM算法深入理解:请戳这里
#include <stdio.h>
#include <string.h>
#define INF 99999999
#define N 350
int n,nx,ny; //nx,ny分别表示x集合和y集合的元素个数
int lx[N];
int ly[N];
int link[N];
int slack[N];
int visx[N];
int visy[N];
int w[N][N];
bool DFS(int x)
{
int y;
visx[x]=1;
for(y=1;y<=ny;y++)
{
if(visy[y]) continue;
int t=lx[x]+ly[y]-w[x][y];
if(t==0)
{
visy[y]=1;
if(link[y]==-1||DFS(link[y]))
{
link[y]=x;
return true;
}
}
else if(slack[y]>t) //不在相等子图中slack 取最小的
slack[y]=t;
}
return false;
}
int KM()
{
int i,j,x;
memset(link,-1,sizeof(link));
memset(ly,0,sizeof(ly));
for(i=1;i<=nx;i++) //lx初始化为与它关联边中最大的
for(j=1,lx[i]=-INF;j<=ny;j++)
if(w[i][j]>lx[i])
lx[i]=w[i][j];
for(x=1;x<=nx;x++)
{
for(i=1;i<=ny;i++)
slack[i]=INF;
while(1)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if(DFS(x)) break; //若成功(找到了增广轨),则该点增广完成,进入下一个点的增广
//若失败(没有找到增广轨),则需要改变一些点的标号,使得图中可行边的数量增加。
//方法为:将所有在增广轨中(就是在增广过程中遍历到)的X方点的标号全部减去一个常数d,
//所有在增广轨中的Y方点的标号全部加上一个常数d
int d=INF;
for(i=1;i<=ny;i++)
if(!visy[i]&&d>slack[i])
d=slack[i];
for(i=1;i<=nx;i++)
if(visx[i])
lx[i]-=d;
for(i=1;i<=ny;i++) //修改顶标后,要把所有不在交错树中的Y顶点的slack值都减去d
{
if(visy[i]) ly[i]+=d;
else slack[i]-=d;
}
}
}
int ans=0;
for(i=1;i<=ny;i++)
if(link[i]>-1)
ans+=w[link[i]][i];
return ans;
}
int main()
{
int i,j;
while(~scanf("%d",&n))
{
nx=ny=n;
memset(w,0,sizeof(w));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&w[i][j]);
int ans=KM();
printf("%d\n",ans);
}
return 0;
}
HDU2255(带权二分图的最大匹配)相关推荐
- HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法
HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...
- 带权二分图匹配(最小费用最大流) 8.2牛客暑期多校训练营五 E
E.room | 时间限制:1 秒 | 内存限制:256M Nowcoder University has 4n students and n dormitories ( Four students ...
- Uvalive3353 Optimal Bus Route Design 带权二分图匹配
题目描述:给出一个有向带权图,现在要求在图中找出若干个环,使得每个点恰好在一个环里,且所有环的距离之和最小,如果不能使每个点恰好在一个环里,输出"N". 思路: 将每个点u拆成u和 ...
- 【BZOJ4819】【SDOI2017】新生舞会(01分数规划,带权二分图匹配)
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的 ...
- HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)
题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...
- [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
二分图匹配 二分图大讲堂--彻底搞定最大匹配数(最小覆盖数).最大独立数.最小路径覆盖.带权最优匹配(转) 文本内容框架: §1图论点.边集和二分图的相关概念和性质 §2二分图最大匹配求解 匈牙利算法 ...
- KM算法--带权二分匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2255 问题概述:有n个人,n个房子,每个人对每个房子出价都不同,你是村长,你如何分配房子才能获得最高收益? 输入 ...
最新文章
- tensorflow model.compile() 示例
- SpringMVC处理MYSQL BLOB字段的上传
- MinGW 编译zlib libpng libjpeg等
- Android播放外部音乐文件
- 一等奖60万,首届“唱圆”杯AI翻译大赛报名中
- DOOM启世录的启示
- 社区护理 100404
- 为什么选择STM32-M3
- 我的新书,《第一行代码 Android 第3版》已出版!
- 批量采集抓取淘宝宝贝上传,采集商品软件
- MissionPlanner MP地面站添加三维地图支持
- java动效_前端实现炫酷动效_Lottie-前端实现AE动效
- 2022年山东省安全员A证特种作业证考试题库模拟考试平台操作
- discuz mysql cpu 100_Discuz导致MYSQL CPU 占用 100%?
- 小波学习笔记——MATLAB
- 上半年要写的博客文章30
- ​百度网盘批量转存分享增量更新软件工具助手
- [Ubuntu]MW150us-rtl8188eu 驱动编译安装
- 利用VS(Visual Studio)自带的工具查看dll/lib文件
- Git mvn 命令