【Hopcroft Karp】HK算法简介

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

【还在Hungary?你Out了~】



今天上午被下面这道题虐了很久..完全没想到是二分图。

迷宫

根据藏宝地图,cj的科学家们找到了藏宝地点,但却发现入口有多个,谁都没敢冒然进入。于是大家停下脚步,想应该从哪一个门进入。突然,图形学家Mercury发现了隐藏在藏宝地图上的秘密,果然有意识呀!他发现,这个地图在暗处时会显现出一个有向无环图(至于为什么有向,我想是因为某种特殊作用力的缘故吧。),而这个图正是这个迷宫的地图。幸亏没有冒然进入,要不然就出不来了。

但是这个地图却没说出口在哪里,哎,只好用Jupiter的超级机器人进洞寻找了。每一个入口将把机器人瞬间传送到对应编号的点(所有点都能到达),为了不让Jupiter同学失去太多他心爱的机器人,我们必须用最少的机器人去搜索每个点(每个点只能被经过一次)。 

输入

第一行两个数n、m,分别表示地图的点数和边数,接下来m行,每行两个数u、v,表示有一条从点u到点v的有向边。 

输出

只有一个数,表示最少要用的机器人数。

 

输入样例

3 2

1 2

2 3

 

输出样例

1

 

数据范围

n<=200000

m<=500000


被邓大牛点醒,一看, 啊,还真是,只是这数据范围...

于是开始学习Hopcroft Karp

说起来其实也不难,

回想我们在做Hungary的时候,每次只增广一条路,如何优化呢?很简单,就是一次多增广。

流程如下:

①BFS找出极短增广路集,当最短增广路集为

匈牙利算法改进 之 队列优化寻找极大增广路径集 —— Hopcroft-Karp算法 【记录】 算法求解:同匈牙利算法解决的问题,只不过优化了时间复杂度。 算法分析:增广sqrt(n)次,每次需要遍历边数m,时间复杂度——O(sqrt(n) * m)。 算法实现: 1,BFS寻找多条不相交的增广路径,找到极大增广路径集。在这个过程中,设置数组dx[]、dy[]建立X集、Y集的层次图,可以理解为维护距离标号。 (可能说法不恰当,这点同最大流Dinic算法里面BFS找一条增广路, 阅读详情

相关推荐

二分图最大匹配-HK算法的简单理解和实现

求一个二分图的最大匹配,朴实的匈牙利算法的复杂度为O (VE),优点是代码量很少,而且顶点数目在1000以内的时候表现不错。 bool dfs(int u,int tot){ for(int i = head[u];i != -1; i = e[i].nxt){ int v= e[i].v; if(vis[v] == tot) continue; vis[v] = tot; if...

积极的防守者的博客 4160

LMSE-HK算法

H-K算法即通过最小均方误差求解最优权向量的过程,相较感知器算法固定增量的迭代,H-K算法可以在模式线性不可分的情况下停止迭代。那么代价呢就是需要计算高维逆矩阵,????进行分析。 对于给定的N个n维模式,如果数据线性可分,则必存在w(n+1维)使得下列成立: 将属于ω2的模式乘以(-1),可得对于全部模式都有的条件。 设两类模式的训练样本总数为N,写成增广形式,则有不等式组: Xw>...

qq_36302589的博客 5799

C/C++ hopcroft karp霍普克洛夫特-卡普算法详解及源码

Hopcroft-Karp算法的基本思想是通过不断寻找增广路径来不断增加匹配的边数,直到无法再找到增广路径为止。增广路径是指在一个匹配中,从一个未匹配点开始,经过一系列的匹配边和未匹配边,最终到达另一个未匹配点的路径。Hopcroft-Karp算法的优点是,它具有较低的时间复杂度,适用于大规模的图。它的缺点是实现起来较为复杂,需要使用BFS或DFS进行图的遍历,同时需要维护一个距离数组。Hopcroft-Karp算法(霍普克洛夫特-卡普算法)是一种用于解决二部图最大匹配问题的有效算法

希望我的博客,能帮上你解决学习中工作中所遇到的问题 7187

二分图匹配之HK算法(知识点总结)

思路来源 https://blog.csdn.net/gddswlz/article/details/9086207(O(sqrt(n)*m)复杂度证明) https://blog.csdn.net/discreeter/article/details/51649155(板子来源) https://blog.csdn.net/qq_35776579/article/details/54945...

小衣同学的博客 3294

二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题

了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集合。 图1为 正常的二分图 图2为二分图的最大匹配 图3 为二分图最大匹配中的增广路 两条 紫色一条 黄色一条。 了解这个算法之前,还需要对一个算法进行比较: 匈牙利算法 匈牙利算法 ...

一只酷酷光儿的博客 3746

HDU2389 Rain on your Parade 二分图匹配——Hopcroft_Karp算法

Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=2389   【前言】   做个二分图的专题。 遇到这道顶点数3000的题目。 用匈牙利邻接表、邻接矩阵,以及匈牙利非递归版本交了三次,均TLE。 然后找到解题报告,说是HK算法。 网上介绍HK算法的资料挺多,但讲解的挺少,拼凑着突然觉悟了。   【思路】

Human_CK的专栏 1021

POJ 1469二分图匹配Hopcroft-Karp算法

题意: 有N个学生和P门课程,让你判断能否构成最大匹配。先输入一个T,表示有T组测试数据;在输入N和P,P表示有P门课程,N表示有N个学生。之后有P行,比如: a  a1 a2 a3 a4 a5---第一行。1与a1,a2,a3,a4,a5有匹配。 b b1 b2 b3-----第二行。2与b1,b2,b3有匹配。 如果匹配数等于学生数目则YES;否则为NO; 上交模

liwei的专栏 1099

二分图最大匹配Hopcroft_Karp算法 及hdu2389

学二分好几天了。。以为匈牙利和KM算法够用的。。没想到我还是太天真了。晚上在切hdu 2389的时候匈牙利一直TLE。好吧!只能去网上看大牛的题解。所以就认识了Hopcroft_Karp算法(简称HK),一个二分匹配中很高效的算法。我们知道匈牙利算法复杂度为O(en),而HK为v(en^0.5),还是很快的。           大概思路:用BFS对X部分的所有未被覆盖的点进行寻找增广路,列出所

a1ways_online的专栏 621

二分图最大匹配及匈牙利、HK算法

二分图最大匹配 在二分图中,最大匹配是指选出尽可能多的边使得任意两边没有公共端点。 增广路 设MMM为二分图GGG已匹配的边的集合,若PPP是图GGG中一条连接两个未匹配顶点的路径(起点终点分别在两个集合),属于MMM的边和不属于MMM的边交替出现,则PPP称为MMM的一条增广路(直接匹配的边也是特殊的增广路)。 如下图所示,当111和AAA已经匹配,而尝试寻找222的匹配时,发现它只能匹配AAA: 然后尝试让222匹配AAA,这时再给111找新的匹配的过程看做:从222出发,遍历到AAA;再从AAA遍历

Happig的博客 2381

Hopcroft-Karp算法模板

http://blog.csdn.net/u011742541/article/details/14104573 bool searchpath() { queueque; dis = inf; memset( dx,-1,sizeof(dx) ); memset( dy,-1,sizeof(dy) ); for( int i = 1; i <= nx; i ++ ) {

菜鸟成长ing 670

Rain on your Parade——二分图匹配Hopcroft-Karp算法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2389 You’re giving a party in the garden of your villa by the sea. The party is a huge success, and everyone is here. It’s a warm, sunny evening, and a ...

mumei的博客 407

SPOJ4206Fast Maximum Matching(hopcroft-karp)

题目请戳这里 题目大意:裸的二分匹配。 题目分析:数据比较强,用来测模版的。这题用hungry跑着会比较吃力,所以用hopcroft-karp算法。这个算法较hungry高效是因为每次bfs找到一个增广路集,然后用dfs进行多路增广,同时找多条增广路,从而效率大增。其实怎么看hk算法都是个没有边权的dinic啊。 参照着wikipedia 敲了一个hk,效率貌似不高啊。。。 详情请见代码:

ophunter的专栏 1202

二分匹配Hopcroft-Karp算法

#include #include #include using namespace std; const int N = 110; const int INF=0x7fffffff; int bmap[N][N];//每次记得清空 //对于两边各50000个点,200000条边的二分图最大匹配可以在1s内出解,效果很好:) struct HK{//用HK算法求解二分最大匹配问题(时间复杂度为sq

野生的TFgirl 734

HK二分图最大匹配算法模板

ps:建图是核心,匹配都是一样的ps:建图是核心,匹配都是一样的ps:建图是核心,匹配都是一样的 //hopcroft_karp算法,复杂度O(sqrt(n)*m) #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <queue> using namespace std; co

weixin_45630722的博客 331

HDU 1045 Fire Net (二分图HK

https://vjudge.net/problem/HDU-1045 把图中连续的行和列都缩成点,因为每个行和列交点处必定不与别的组合冲突。 这样先把符合条件的边加上,最后跑HK就行 以后不管多么简单的题都要用HK,因为实在是比匈牙利快太多了 #include<iostream> #include<cstring> #include<cstdio> ...

STOP 159

Hopcroft-Karp 二分图HDU2389 Rain on your Parade

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2389 题意:一些人的坐标和速度,一些雨伞位置,规定人可以运动的时间,人不分高低贵贱。求最优的匹配方案使得尽可能多的伞有人。 思路:二分图版题,由于数据量达到1e3使用HK算法。初始化处理人为X集,雨伞为Y集,通过计算距离求得边。然后求最大匹配。 学习了HK算法,其实是增加了一个源点和汇点,然后把

beihai2013 434

Rain on your Parade HDU - 2389(二分+HK

匈牙利算法复杂度o(VE),HK复杂度(sqrt(v)E),这题建图就要3000*3000,用二分优化完再匈牙利爆栈了,只能用HK了,这个模板原来用过,发现ny就没有用,nx是x方的点数 #include<iostream> #include<cstring> #include<string> #include<cstdio> #include&lt...

仰望蓝天的博客 138

【模板】解决二分图匹配的强力算法——Hopcroft-Karp算法

详细解释 参见:http://blog.csdn.net/wall_f/article/details/8248373 简要过程 HK算法可以当成是匈牙利算法的优化版,和dinic算法的思想比较类似。 每次先通过bfs来确定所有点的距离,然后再对每个点进行dfs找增广路,并限制每次增广的时候(走到的点的距离)=(当前的点距离+1)。 于是很愉快地在UOJ跑进了第一页~ upd:加了一些特技之后跑...

weixin_30362233的博客 246

LightOJ1356 最大独立集 HK算法 素数分解

&#13; 解析 当a和b满足\(a = b \times prime\)时,我们说a,b有冲突关系,将所有数看成是图中的顶点,那么a和b有冲突关系,就在a,b之间连一条边。题目是:给定一些数,从这些数中选出一些数组成一个集合,使这个集合中的每两个数都没有冲突关系,也就是每两个顶点之间都没有边,问这个集合最多可以有多少个数。 任意一个整数可以分解为多个素数因子的乘积,而只有分...

ErrorNam的专栏 337
上一篇: 【AHOI2004】数字迷阵 [ 结论题 ]
下一篇: 【NOIP2010】导弹拦截,偏序集和Dilworth
emoizhang
博客等级 码龄14年 7粉丝 41原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值