详细解释

参见: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算法的更多相关文章

  1. 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 ...

  2. P3386 【模板】二分图匹配(匈牙利&最大流)

    P3386 [模板]二分图匹配 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正 ...

  3. 洛谷—— P3386 【模板】二分图匹配

    P3386 [模板]二分图匹配(复习) 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每 ...

  4. luogu P3386 【模板】二分图匹配

    二次联通门 : luogu P3386 [模板]二分图匹配 /* luogu P3386 [模板]二分图匹配 最大流 设置源点,汇点,连到每条边上 跑一边最大流即可 */ #include <i ...

  5. P3386 【模板】二分图匹配(匈牙利算法)

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  6. P3386 【模板】二分图匹配

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  7. AC日记——【模板】二分图匹配 洛谷 P3386

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  8. 洛谷 P3386 【模板】二分图匹配

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  9. P3386 【模板】二分图匹配 -网络流版

    二分图匹配 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+ ...

随机推荐

  1. Go语言【第十篇】:Go数据结构之:指针

    Go语言指针 Go语言中指针是很容易学习的,Go语言中使用指针可以更简单的执行一些任务.我们都知道变量是一种使用方便的占位符,用于引用计算机内存地址.Go语言的取地址符是 &,放到一个变量前使 ...

  2. 生成模型(Generative Model)Vs 判别模型(Discriminative Model)

      概率图分为有向图(bayesian network)与无向图(markov random filed).在概率图上可以建立生成模型或判别模型.有向图多为生成模型,无向图多为判别模型. 判别模型(D ...

  3. [洛谷P4345][SHOI2015]超能粒子炮·改

    题目大意:给你$n,k$,求:$$\sum\limits_{i=0}^k\binom n i\pmod{2333}$$题解:令$p=2333,f(n,k)\equiv\sum\limits_{i=0} ...

  4. 【BZOJ5297】【CQOI2018】社交网络(矩阵树定理)

    [BZOJ5297][CQOI2018]社交网络(矩阵树定理) 题面 BZOJ 洛谷 Description 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发 ...

  5. Linux回收站(改写rm防止误删文件无法恢复)

    rm -rf 慎用 命令敲得多了,常在河边走,难免会湿鞋 昨天,一个手误,敲错了命令,把原本想要留的文件夹给rm -rf掉了 几天心血全木有了,靠,死的心都有了 经百度,google以及尝试无果,哎, ...

  6. httpclient post请求带参数返回数据乱码问题解决

    客户端代码: //带参数的post请求 @Test public void doPostWithParam() throws Exception { CloseableHttpClient httpC ...

  7. django-jet 中文文档

    关于 JET是新式的Django管理界面并且增强了功能.     内容 文档 开始 安装django-jet 安装仪表盘 配置 配置文件 自动补全 紧凑内联 过滤器 仪表盘 自定义仪表盘 仪表盘模块 ...

  8. java入门实现转换

    设计思想 首先不用多说就是建立最基础的java创建,然后抛出一个异常处理来替我们检测用户的输入,这一点十分重要.然后就要进行输入工作,不必多说,网上的教程有一个Scanner的输入方法,我们引入一下. ...

  9. c# 深拷贝与浅拷贝的区别分析及实例

    浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的. 深拷贝是指源对象与拷贝对象互相独 ...

  10. JS如何判断是不是iphoneX

    function isIphoneX(){ return /iphone/gi.test(navigator.userAgent) && (screen.height == 812 & ...