模板——二分图匹配KM
具体方法就不介绍了,详见 https://blog.csdn.net/sixdaycoder/article/details/47720471
主要讲一些注意点:
1:不直接将未匹配的y减小是因为要保证lx[i]+ly[j]>=w[i][j],证明详见上述博客
2:因为多组数据,所有数组都记得清零
3:dfs中坑了我20多次MLE……记得visx,visy数组都要更新
4:这种做法仅限于每一个点都能被匹配的情况,若不能都匹配就要用网络流
5:只有在值相等时才能赋值visy
二分图匹配模板题:(值得思考)
#include<bits/stdc++.h>
using namespace std;
int V,n,m,e;
vector<int> v[];
int vis[],match[]; int init()
{
memset(match,-,sizeof(match));
scanf("%d%d%d%d",&V,&n,&m,&e);
for(int i=;i<=e;i++)
{
int x,y;
scanf("%d%d",&x,&y); y+=n;
v[x].push_back(y);
}
} int dfs(int u)
{
for(int i=;i<(int)v[u].size();i++)
{
int p=v[u][i];
if(vis[p]) continue;
vis[p]=;
if(match[p]==-||dfs(match[p])==)
{
match[u]=p;
match[p]=u;
return ;
}
}
return ;
} int main()
{
int sum=;
init();
for(int i=;i<=n;i++)
{
if(match[i]==-)
{
memset(vis,,sizeof(vis));
if (dfs(i)) sum++;
}
}
printf("%d\n",min(V+,n+m-sum));
return ;
}
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
const int inf=0X3f3f3f; int w[N][N];
int n,ans=;
int lx[N],ly[N],match[N],slack[N];
bool visx[N],visy[N]; void init()
{
for(int i=;i<n;i++) visy[i]=;
for(int i=;i<n;i++) visx[i]=;
} bool dfs(int u)
{
int Delta;
visx[u]=;
for(int v=;v<n;++v)
{
if(visy[v]) continue;
Delta=lx[u]+ly[v]-w[u][v];
if(Delta==)
{
visy[v]=;
if(match[v]==-||dfs(match[v]))
{
match[v]=u;
return true;
}
}
else if(slack[v] > Delta)
slack[v] = Delta;
}
return false;
} void KM()
{
for(int x=;x<n;++x)
{
for(int y=;y<n;++y) slack[y]=inf;
while(true)
{
init();
if(dfs(x)) break;
int delta=inf;
for(int j=;j<n;++j) if(!visy[j]&&delta>slack[j]) delta=slack[j];
for(int i=;i<n;++i) if(visx[i]) lx[i]-=delta;
for(int j=;j<n;++j)
{
if(visy[j]) ly[j]+=delta;
else slack[j]-=delta;//important
}
}
}
} int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(match,-,sizeof(match));
memset(ly,,sizeof(ly));
for(int i=;i<n;++i) match[i]=-;
for(int i=;i<n;++i)
{
for(int j=;j<n;++j)
{
scanf("%d",&w[i][j]);
}
}
for(int i=;i<n;++i)
{
lx[i]=-inf;
for(int j=;j<n;j++) if(lx[i]<w[i][j]) lx[i]=w[i][j];
}
KM(); ans=;
for(int i=;i<n;++i)
{
if(match[i]!=-) ans+=w[match[i]][i];
}
printf("%d\n",ans);
}
return ;
}
模板——二分图匹配KM的更多相关文章
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- 牛客多校第五场 E room 二分图匹配 KM算法模板
链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...
- hdu1853 Cyclic Tour (二分图匹配KM)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- [洛谷P3386] [模板] 二分图匹配 (匈牙利算法)
题目传送门 毒瘤出题人zzk出了个二分图匹配的题(18.10.04模拟赛T2),逼我来学二分图匹配. 网络流什么的llx讲完之后有点懵,还是匈牙利比较好理解(绿与被绿). 对于左边的点一个一个匹配,记 ...
- 二分图匹配--KM算法
Kuhn-Munkres算法 KM算法,求完备匹配下的最大权匹配,时间复杂度O(\(n^3\)) 所谓的完备匹配就是在二部图中,x点集中的所有点都有对应的匹配 且 y点集中所有的点都有对应的匹配 ,则 ...
- 【洛谷 p3386】模板-二分图匹配(图论)
题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数. 解法:匈牙利算法.(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配 ...
- Assignment HDU - 2853(二分图匹配 KM 新边旧边)
传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...
- 运动员最佳匹配问题 KM算法:带权二分图匹配
题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...
- 二分图匹配之最佳匹配——KM算法
今天也大致学了下KM算法,用于求二分图匹配的最佳匹配. 何为最佳?我们能用匈牙利算法对二分图进行最大匹配,但匹配的方式不唯一,如果我们假设每条边有权值,那么一定会存在一个最大权值的匹配情况,但对于KM ...
随机推荐
- Codeforces 479【A】div3试个水
题目链接:http://codeforces.com/problemset/problem/977/A 题意:这个题,题目就是让你根据他的规律玩嘛.末尾是0就除10,不是就-1. 题解:题解即题意. ...
- Selenium(二)---无界面模式+滑动底部
一.使用无界面模式 1.正常情况启动 selenium 是有界面的 2.有些情况下,需要不显示界面,这时只要设置一下参数就可以实现了 # 不想显示界面可以用 Chrome——配置一下参数就好 from ...
- php 获取不到post的值
一般在ajax提交的时候出现这种情况 当我们在ajax参数设置 contentType: 'application/json; charset=utf-8', 用file_get_contents ...
- css---过渡天坑
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【JZOJ6273】欠钱
description analysis 读懂题就可知\(b\)的收益即为\(a\)到\(b\)这一条链上边权的最小值 那么就是动态维护一个森林,询问链上最小值,同时必须满足儿子走向父亲 明显\(LC ...
- Oracle大数据SQL语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 混合云存储组合拳:基于云存储网关与混合云备份的OSS数据备份方案
前言 阿里云对象存储(OSS)用户众多.很多用户因为业务或者合规性需求,需要对OSS内的数据做备份,无论是线上备份,还是线下备份.用户可以选择使用OSS的开放API,按照业务需求,做数据的备份,也可以 ...
- js面试总结3
异步和单线程 题目: 1.同步和异步的区别? 2.一个关于setTimeout的笔试题. 3.前段使用异步的场景有哪些? 什么是异步? console.log(100) setTimeout(func ...
- js 异步编程思想
一.js中的异步编程有四种情况 1.定时器 2.所有的事件绑定 3.ajax异步请求 4.回调函数
- Block的Retain Cycle的解决方法
一个使用Block语法的实例变量,在引用另一个实例变量的时候,经常会引起retain cycle.这个问题在使ASIHTTPRequest的block语法的时候会时不时的碰到.这个问题困扰了我这个小白 ...