【模板】解决二分图匹配的强力算法——Hopcroft-Karp算法
详细解释
参见:http://blog.csdn.net/wall_f/article/details/8248373
简要过程
HK算法可以当成是匈牙利算法的优化版,和dinic算法的思想比较类似。
每次先通过bfs来确定所有点的距离,然后再对每个点进行dfs找增广路,并限制每次增广的时候(走到的点的距离)=(当前的点距离+1)。
于是很愉快地在UOJ跑进了第一页~
upd:加了一些特技之后跑的更快了
模板代码
//UOJ 78
#include <bits/stdc++.h>
using namespace std;
const int MAXN=505, MAXB=2e7, INF=0x3f3f3f3f;
char buf[MAXB], *cp=buf;
void rd(int &x){
x=0;
while(*cp<'0'||'9'<*cp) cp++;
while('0'<=*cp&&*cp<='9') x=x*10+*cp-'0', cp++;
}
int nl, nr, M, now, dis;
int ml[MAXN], mr[MAXN], dl[MAXN], dr[MAXN], vis[MAXN], q[MAXN];
int E[MAXN][MAXN], sz[MAXN];
int bfs(){
memset(dl, -1, sizeof(dl));
memset(dr, -1, sizeof(dr));
int ff=0, rr=0; dis=INF;
for(int i=1; i<=nl; ++i) if(!ml[i]) dl[i]=0, q[rr++]=i;
while(ff<rr){
int u=q[ff++]; if(dl[u]>dis) break;
for(int *e=E[u]; *e; ++e){
int v=*e;
if(dr[v]==-1){
dr[v]=dl[u]+1;
if(mr[v]){dl[mr[v]]=dr[v]+1, q[rr++]=mr[v];}
else dis=dr[v];
}
}
}
return dis<INF;
}
int dfs(int u){
for(int *e=E[u]; *e; ++e){
int v=*e;
if(dr[v]==dl[u]+1&&vis[v]!=now){
vis[v]=now;
if(!mr[v]||dfs(mr[v])) return mr[v]=u, ml[u]=v, 1;
}
}
return 0;
}
int HK(){
int r=0;
while(bfs()){
now++;
for(int i=1; i<=nl; ++i) if(!ml[i]) r+=dfs(i);
}return r;
}
int main(){
fread(buf, 1, MAXB, stdin);
rd(nl), rd(nr), rd(M);
for(int i=0, u, v; i<M; ++i) rd(u), rd(v), E[u][sz[u]++]=v;
printf("%d\n", HK());
for(int i=1; i<nl; ++i) printf("%d ", ml[i]);
printf("%d\n", ml[nl]);
return 0;
}
【模板】解决二分图匹配的强力算法——Hopcroft-Karp算法的更多相关文章
- hdu2389二分图之Hopcroft Karp算法
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- P3386 【模板】二分图匹配(匈牙利&最大流)
P3386 [模板]二分图匹配 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正 ...
- 洛谷—— P3386 【模板】二分图匹配
P3386 [模板]二分图匹配(复习) 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每 ...
- luogu P3386 【模板】二分图匹配
二次联通门 : luogu P3386 [模板]二分图匹配 /* luogu P3386 [模板]二分图匹配 最大流 设置源点,汇点,连到每条边上 跑一边最大流即可 */ #include <i ...
- P3386 【模板】二分图匹配(匈牙利算法)
题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...
- P3386 【模板】二分图匹配
题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...
- AC日记——【模板】二分图匹配 洛谷 P3386
题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...
- 洛谷 P3386 【模板】二分图匹配
题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...
- P3386 【模板】二分图匹配 -网络流版
二分图匹配 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+ ...
随机推荐
- Andorid API Package ---> android.accessibilityservice
包名: android.accessibilityservice Added in API level 4 URL:http://developer.andro ...
- CentOS 输入输出重定向
标准输入重定向(STDIN,文件描述符为 0):默认从键盘输入,也可从其他文件或命令中输入.(文件描述符可以省略) 标准输出重定向(STDOUT,文件描述符为 1):默认输出到屏幕.(文件描述符可以省 ...
- 【BZOJ4892】DNA(后缀数组)
[BZOJ4892]DNA(后缀数组) 题面 BZOJ 洛谷 题解 看到这道题目,我第一反应是\(FFT\)??? 然后大力码出了一个\(FFT\) 就像这样 #include<iostream ...
- BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空 ...
- UVA.674 Coin Change (DP 完全背包)
UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...
- bzoj 1468 Tree 点分
Tree Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1972 Solved: 1101[Submit][Status][Discuss] Desc ...
- HDU1254 bfs
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Itext2.0.8 和freemarker导出pdf
这个是跟上一篇写的freemarker导出word是一块的.但是关联性不是很大.由于本人技术有限本篇导出也是根据网上大家的做出的demo混合而成.有不足的地方请大家指出.好改正,使以后看到的freem ...
- 实体框架(Entity Framework)快速入门
实体 框架 (Entity Framework )简介 实体框架Entity Framework 是 ADO .NET 中的一组支持 开发 面向数据的软件应用程序的技术.是微软的一个ORM框架. OR ...
- [LeetCode] 17. Letter Combinations of a Phone Number ☆☆
Given a digit string, return all possible letter combinations that the number could represent. A map ...