Hopcroft-Karp算法模板

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

http://blog.csdn.net/u011742541/article/details/14104573


//Hopcroft-Karp算法 有点类似dinic 都是先对图BFS分层再沿层数DFS找增广路    
//***************************************************************************    
bool searchPath()        //BFS 对二分图分层    
{  
    dist = inf;  
    queue<int>que;  
    memset( dx,-1,sizeof(dx) );  
    memset( dy,-1,sizeof(dy) );  
    for( int i = 1; i <= nx; i ++ ){  //找到x集合所有未被匹配的点压入队列中  
        if( cx[i] == -1 ){  
            que.push(i);  
            dx[i] = 0;  
        }  
    }  
    while( !que.empty() ){  
        int u = que.front(); que.pop();  
        if( dx[u] > dist )    //只分层到第一个找个的可匹配点层数  
            break;  
        for( int v = 1; v <= ny; v ++ ) {  
            if( map[u][v] && dy[v] == -1 ){  
                dy[v] = dx[u] + 1;  
                if( cy[v] == -1 )      //找个一个可以匹配点 标记分层的层数   
                    dist = dy[v];  
                else{  
                    dx[cy[v]] = dy[v] + 1;  
                    que.push( cy[v] );  
                }  
            }  
        }  
    }  
    return dist != inf;          
}  
bool findPath( int u )    //沿着层数DFS    
{  
    for( int v = 1; v <= ny; v ++ ){  
        if( map[u][v] && !vis[v] && dy[v] == dx[u] + 1 ){  
            vis[v] = true;  
            if( cy[v] != -1 && dy[v] == dist  )    //如果v已经有匹配了且v的层数为dist( 最大层数为dist 所以v原来匹配的不可能再匹配 )  
                continue;  
            if( cy[v] == -1 || findPath( cy[v] ) ){   //如果v未匹配就跟u匹配v 否则看v原来匹配的是否还能跟其他的匹配 能就跟u匹配 不能就不匹配   
                cy[v] = u;  
                cx[u] = v;  
                return true;  
            }  
        }  
    }  
    return false;  
}  
int HK_MaxMatch()  
{  
    int ans = 0;  
    memset( cx,-1,sizeof(cx) );  
    memset( cy,-1,sizeof(cy) );  
    while( searchPath() ){   //分层 + 判断是否还有未匹配点  
        memset( vis,0,sizeof(vis) );  
        for( int i = 1; i <= nx; i ++ ){    
            if( cx[i] == -1 )  
                ans += findPath(i);  
        }  
    }  
    return ans;  
}  
//***************************************************************************   


Hopcroft-Karp算法模板(匈牙利算法的优化版本) struct Edge { int v,next; }edge[N*N]; int cnt,head[N]; int xline[N],yline[N],dy[N],dx[N];///xline表示与x配对的y编号,yline表示与y配对的x编号,dy,dx表示在各自集合里的编号 int vis[N],dis; void addedge(int u,int v) { edge[ 阅读详情

相关推荐

计算二分图最大匹配的Hopcroft-Karp算法-[1973年原始论文, 附翻译的中文版].

A n^2.5 algorithm for maximum matchings in bipartite graphs-[英文版, John E. Hopcroft & Richard M. Karp] A n^2.5 algorithm for maximum matchings in bipartite graphs-[中文版, John E. Hopcroft & Richard M. Karp] Hopcroft-Karp是计算二分图最大匹配的最快算法(根据《算法导论》第二版;但维基百科说有理论上更快的算法,不过实际效果不如Hopcroft-Karp,因为实际的图多为稀疏的,更快算法对稠密的图效果会更好)。 算法发表于1973年,附带翻译的中文版。 本人邮箱:xionghuaidong@163.com

Hopcroft-Karp 算法

Hopcroft-Karp算法是求二分图最大匹配的匈牙利算法的优化算法。代码虽然比匈牙利算法的代码量大,复杂一些,但时间复杂度优化不少。这里先暂记一下模板,里面有注释。日后在补上说明和讲解,其实我不会证明。学算法都只是学会了怎么用,没学懂过证明。(惭愧)。 以下第一张图是洛谷的模板题使用匈牙利的情况。 第二张是使用 Hopcroft-Karp的情况。 代码不记得是不是模板题的代码,但...

SuperBvs的博客 3328

Linux 之 supervisor安装和使用

运行Supervisor的后台服务,它用来启动和管理那些你需要Supervisor管理的子进程,响应客户端发来的请求,重启意外退出的子进程,将子进程的stdout和stderr写入日志,响应事件等。它是Supervisor最核心的部分。

chang995196962的博客 5531

二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配...

二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配 文本内容框架: §1图论点、边集和二分图的相关概念和性质 §2二分图最大匹配求解 匈牙利算法Hopcroft-Karp算法 §3二分图最小覆盖集和最大独立集的构造 §4二分图最小路径覆盖求解 §5二分图带权最优匹配求解 Kuhn-Munkers算法 §6小结 每章节都...

qiudesuo的专栏 1733

Hopcroft-Karp算法 poj-1469 COURSES

Hopcroft-karp算法算法由John.E.Hopcroft和Richard M.Karp于1973提出,故称Hopcroft-Karp算法。 使用情形 给定一个二分图,求其最大匹配。 原理简述 在增广匹配集时,每次寻找多条增广路径,以进一步减少时间复杂度。 步骤及示例演示 dx【】、dy【】 分别表示二分图左右不顶点的距离标号 mx【】、my【】 分别表示二分图左右部顶点的距离标号 1、我们每次从所有未匹配的左部节点开始BFS,进行距离标号。 2、对于每一个队列中的左部节点X,考虑与它相邻的所有

饮闲的博客 803

二分图最大匹配之Hopcroft-Karp算法 详解

Hopcroft-Karp算法 原链接 该算法由John.E.Hopcroft和Richard M.Karp于1973提出,故称Hopcroft-Karp算法。 原理 为了降低时间复杂度,可以在增广匹配集合M时,每次寻找多条增广路径。这样就可以进一步降低时间复杂度,可以证明,算法的时间复杂度可以到达O(n^0.5*m),虽然优化不了多少,但在实际应用时,效果还是很明显的。 基本算法 该算...

qq_41668093的博客 2193

【图论】 二分图最大匹配与最大独立集

现在有了二分图,假如两部分ab之间的边表示A部分的a可以和B部分的b进行配对,并且每个人只能匹配一个人,那么怎么能在不产生冲突的条件下,匹配最多的对数呢?

这里是阿安的博客 2603

匈牙利算法hopcroft_karp算法模板

今晚学习了hopcroft_karp算法,留个模板,顺便也留个匈牙利算法模板。 题目为POJ 1469,在本题中,两种算法所用时间基本一致 //hopcroft_karp算法,复杂度O(sqrt(n)*m) #include #include #include #include #include #include using namespace std; const int N

弱智就要多努力 2361

【二分图匹配】Hopcroft-Karp算法模板

Hopcroft-Karp算法: Hopcroft-Karp算法的思想与dinic类似,就是在分层图的基础上一次求多条不相交的最短路径,可以增明最多在√n次数内完成。这里只是上传一下模板,看讲解的可以略过。 Hopcroft-Karp模板: /* 二分图Hopcroft-karp算法模板 * 使用前初始化G,uN赋值为左边节点的个数 * mx,my分别表示二分图左边和右边的匹配

Summer_via的博客 809

二分图最大匹配——hopcroft-karp算法模板

hopcroft-karp算法用于二分图最大匹配,是匈牙利算法的改进,做法是一次处理多条增广路径,而不是像匈牙利算法一样找到一条处理一条,这样时间复杂度可以改进为O(sqrt(n)*m) 模板: 对应的题目是POJ-1469 #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; #includ...

Q755100802的博客 535

hdu 2389 比匈牙利算法更快的Hopcroft-Karp算法模板

题意:从具体情境中抽象出m个点匹配n个点。m,n&lt;=3000。 题解:Hopcroft-Karp算法 1.匈牙利算法O(V * E)有详细图解,但是Hopcroft-Karp算法O(V^0.5 * E)死活没有搜索到图解博客。看代码大概知道是批量找增广路,但具体怎么找没有很清晰的印象,但是掌握了模板还是好了一些。 2.模板:https://blog.csdn.net/becky_w/a...

Irving0323的博客 469

模板整合】匈牙利算法Hopcroft-Karp算法

匈牙利的DFS实现#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 1010 using namespace std; int n,m; int map[MAXN][MAXN],num[MAXN]; bool vis[MAXN]; int ans

CreationAugust is 14 years old forever 1877

二分图最大匹配算法模板(匈牙利 + Hopcroft-Karp

1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 #include<queue> 6 /* 7 二分图最大匹配:Hopcroft-Karp算法 8 //邻接矩...

dechi5213的博客 161

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

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

weixin_30362233的博客 246

转:二分图最大匹配Hopcroft_Karp算法

<br /> <br />二分图最大匹配除了匈牙利算法还有一个Hopcroft-Karp算法,匈牙利算法的复杂的为O(ne),而Hopcroft-Karp算法的<br />复杂度为O(en^0.5)。<br />     该算法的精髓在于同时找多条增广路进行反转。我们先用BFS找出可能的增广路,这里用到BFS层次搜索的概念,<br />记录当前结点在第几层,用于后面DFS沿增广路反转时用,然后再用DFS沿每条增广路反转。这样不停地找,直至无法找<br />到增广路为止。<br />     wiki上的说明

志当存高远 1万+

二分图最大匹配算法-Hopcroft-Karp模板

#include #include const int N=500,M=500,INF=0x3f3f3f3f; int dx[N],dy[M],sx[N],sy[M],p[N],q[N],a[N][M],l,r,n,m,d; //dx为左边点在增广路径中的距离,dy同理;sx为左边点的匹配点,sy同理; //n为左边点数,m为右边点数,d为每次bfs中最大增光路集中的最长路径长度 int bfs

小草 503

二分图最大匹配 Hopcroft-Karp算法模板

#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <cmath> using namespace std; const int MAXN = 3010;...

weixin_33961829的博客 164

Hopcroft-Karp算法模板(解决二分图最大匹配问题)

#include #include

z956281507的博客 1458

HDU2389 Rain on your Parade 二分匹配 Hopcroft-Carp的算法+模版

这道题目一开始用最常用的匈牙利算法就超时,后来网上查了一下,原来给忘了二分匹配中还有一个Hopcroft-Carp的算法,直接找了个模版套了一下,1A,好开心 先讲一下题目的意思,第一行案例数,每个案例第一行 代表还有多少单位时间开始下雨,然后是 N个访客,接下来N行是 每个访客的位置(一维坐标平面内)和他的移动速度,接下来M行 代表雨伞数目,接下来M行表示各个雨伞的位置,问在下雨前 最

shaonianguai 1164
上一篇: KM模板
下一篇: Dijstra算法模板
___Evan
博客等级 码龄13年 20粉丝 280原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值