详细解释

参见: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. NOIP2018初赛 游记

    这玩意写个鬼游记啊 听说普及+提高的考两张卷子€€£也是想得出来 怎么监考还能咕咕咕的啊 怎么我到快结束了才做完啊 怎么我根本不知道初赛能带啥啊 怎么dij我都能想着对的选了错的啊 怎么我根本不知道图 ...

  2. (四)Redis哈希表Hash操作

    Hash全部命令如下: hset key field value # 将哈希表key中的字段field的值设为value hget key field # 返回哈希表key中的字段field的值val ...

  3. (三)Redis列表List操作

    List全部命令如下: lset key index value # 将列表key下标为index的元素的值设置为value,当 index 参数超出范围,或对一个空列表(key不存在)进行lset时 ...

  4. RESTful Webservice

    1,REST和RESTFUL是什么? REST ( REpresentational State Transfer ),State Transfer 为 "状态传输" 或 &quo ...

  5. 弱校的ACM奋斗史

    这是一篇老文章,不过由于无法找到最初的发文地址,这里就不能粘贴原文网址了.本站转载此文与ACMer们共勉.感谢acmerfight供稿. 题解:还记得2年前的一个晚上,我和一个女孩一起写完了这篇文章. ...

  6. UVA.10130 SuperSale (DP 01背包)

    UVA.10130 SuperSale (DP 01背包) 题意分析 现在有一家人去超市购物.每个人都有所能携带的重量上限.超市中的每个商品有其相应的价值和重量,并且有规定,每人每种商品最多购买一个. ...

  7. bzoj Usaco补完计划(优先级 Gold>Silver>资格赛)

    听说KPM初二暑假就补完了啊%%% 先刷Gold再刷Silver(因为目测没那么多时间刷Silver,方便以后TJ2333(雾 按AC数降序刷 ---------------------------- ...

  8. vue中使用 contenteditable 制作输入框并使用v-model做双向绑定

    <template> <div class="div-input" :class="value.length > 0 ? 'placeholder ...

  9. JS获取移动端系统信息(操作系统、操作系统版本、横竖屏状态、设备类型、网络状态、生成浏览器指纹)

    function getOS() { // 获取当前操作系统 var os; if (navigator.userAgent.indexOf('Android') > -1 || navigat ...

  10. POJ1236:Network of Schools (思维+Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24880   Accepted: 99 ...