二分匹配Hopcroft-Karp算法

深入探讨二分匹配算法及其应用实例 在图论中,二分图(Bipartite Graph)是一种特殊类型的图,在该图中顶点可以被划分为两个互不相交的集合,使得图中的每条边连接的两个顶点分别属于这两个集合。这种结构常见于许多实际应用中,例如社交网络中的好友关系或企业与员工之间的雇佣关系。首先,我们需要将问题转化为二分图。在图中,每个用户表示为一个顶点,并且用户之间的好友关系表示为连接两个顶点的边。因此,如果两个用户是好友,那么在图中就会有一条边连接他们。 阅读详情
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 110;
const int INF=0x7fffffff;
int bmap[N][N];//每次记得清空
//对于两边各50000个点,200000条边的二分图最大匹配可以在1s内出解,效果很好:)
struct HK{//用HK算法求解二分最大匹配问题(时间复杂度为sqrt(v)*e)
    int nx,ny,dis;
    int cx[N];//cx[i]表示左集合i顶点所匹配的右集合的顶点序号
    int cy[N]; //cy[i]表示右集合i顶点所匹配的左集合的顶点序号
    int dx[N];
    int dy[N];
    int Q[N];
    bool bmask[N];
    bool searchpath(){//极大最短增广路集
        int front,rear;
        front=rear=0;//初始化队列
        dis=INF;
        memset(dx, -1, sizeof(dx));
        memset(dy, -1, sizeof(dy));
        for(int i=1;i<=nx;i++){
            if(cx[i]==-1)//左边未匹配
            {
                Q[rear++]=i;//将左边节点放入队列
                dx[i]=0;//分层 所有潜在起点构成0层
            }
        }
        
        while(front<rear){
            int u=Q[front++];//u都是未匹配的
            if(dx[u]>dis)break;
            for(int v=1;v<=ny;v++){
                if(bmap[u][v]&&dy[v]==-1){//相邻未分层构成i+1层。
                    dy[v]=dx[u]+1;//v对应的距离 为u对应距离加1
                    if(cy[v]==-1)dis=dy[v];//右侧未匹配,更新最短距离
                    else{
                        dx[cy[v]]=dy[v]+1;//右侧已经匹配,根据已匹配边回溯。分层
                        Q[rear++]=cy[v];//左侧已匹配点入队。
                    }
                }
            }
        }
        return dis!=INF;
    }
    int findpath(int u){//只搜索极大最短增广路集中的边
        for(int v=1;v<=ny;v++){
            if(!bmask[v]&&bmap[u][v]&&dy[v]==dx[u]+1){//反向搜索的过程
                bmask[v]=1;
                if(cy[v]!=-1&&dy[v]==dis)continue;
                if(cy[v]==-1||findpath(cy[v])){
                    cy[v]=u;
                    cx[u]=v;
                    return 1;
                }
            }
        }
        return 0;
    }
    int Max_match(){
        int res=0;
        memset(cx,-1,sizeof(cx));
        memset(cy,-1,sizeof(cy));
        while(searchpath()){
            memset(bmask, 0, sizeof(bmask));
            for(int i=1;i<=nx;i++){
                if(cx[i]==-1){
                    res+=findpath(i);
                }
            }
        }
        return res;
    }
};
HK hk;
//调用的时候确定hk.nx,hk.ny,然后直接调用Max_match()就行

无人机散热系统设计:从材料选择到智能调控的全面解析 本文全面解析无人机散热系统设计,从材料选择到智能调控,探讨了导热界面材料、轻量化散热结构和智能调控算法的应用。通过实战案例,展示了如何在极端环境下优化散热性能,提升无人机的工作效率和可靠性。 阅读详情

相关推荐

Bugku中的source

进入环境后 我们首先查看源码可以得到一个flag 这肯定是个假的(已经提交过了确实是个假的) 题目提示要用Linux 这里使用的是kali 我们首先dirsearch一下这个网站 可以看到有.git文件泄露 也可以点开那个链接但是在里面没有到flag 然后选择下载这个.git文件 然后进入这个文件夹 输入git reflog查看文件状态 可以看到有四个都有flag is here 一个一个查看git show 然后在40c6d51中发现了我们需要的fl

A272036149的博客 971

Hopcroft-Karp算法的代码理解

#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <que

sabr_的博客 737

反爬虫:POST 请求参数中 Sign 的加密机制详解,并设计带 Sign 校验的网站

本文介绍了API请求中sign签名的生成原理及实现方法。sign是通过对请求参数加密生成的一串字符串,用于验证请求合法性,防止参数篡改、重放攻击和伪造请求。其生成步骤包括参数排序、拼接字符串、加盐和哈希加密。文章还演示了如何在FastAPI后端实现带sign验证的新闻网站,包括参数校验、时间戳验证和签名比对等安全措施,有效提升API安全性,增加爬虫逆向难度。

数据知道的博客 4021

转:二分图最大匹配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万+

HopcroftKarp algorithm

1

qq_66485519的博客 618

Hopcroft-Karp 算法

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

SuperBvs的博客 3328

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算法 及hdu2389

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

a1ways_online的专栏 621

SPOJ4206Fast Maximum Matching(hopcroft-karp)

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

ophunter的专栏 1202

【运筹优化】最大二分匹配问题及两种算法详解 + Python代码实现

最大二分匹配(MBM)问题中,给定一个二分图 G,即分左右两部分,两个部分内部的点没有边连接,要求选出一些边,使得这些边没有公共顶点,且边的数量最大。上面的描述可能比较抽象,我们可以假想成男女配对。如下图所示,男女之间的连线代表他们互相之间有好感,假设你现在是一个媒婆,你的目标是在不违反男女双方自由意志的前提下,尽可能撮合出最多对的情侣。这就是最大二分匹配问题!匈牙利算法-看这篇绝对就够了!

知不足而奋进,望远山而前行 5647

hdu2389+二分匹配Hopcroft-Karp算法

题意很简单,显然是对客人与伞做匹配,求最大匹配数。 一开始用了匈牙利,果断TLE。。。 好吧,原来二分匹配还有这个奇葩算法。。然而敲完还是不明白这个算法啥意思。。。 附两个算法时间复杂度: 匈牙利:O(VE) H-K :O(V^0.5 E) 1 #include<cstdio> 2 #include<cstring> 3 #inclu...

weixin_30621919的博客 188

二分匹配水题 POJ 1469

poj1469:http://poj.org/problem?id=1469 COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19967   Accepted: 7860 Description Consider a group of

hahaAll的博客 257

HDU2389Rain on your Parade 二分匹配Hopcroft-Karp

Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others) Total Submission(s): 3963 Accepted Submission(s): 1320 Problem Description You’re giving a p

LuRiCheng的博客 479

二分匹配加速算法(简单,就是先把能匹配的先出来,不用Hopcroft_Karp算法

#include<bits/stdc++.h> using namespace std; int n,m; int INF=0x3f3f3f; int dis; int cx[3003]; int dy[3002]; int cy[3003]; int dx[3003]; int used[3002]; int a[3003]; int b[3002]; int c[3002]; i...

weixin_42165786的博客 510

Rain on your Parade HDU - 2389 (二分匹配Hopcroft-Karp算法

Rain on your Parade  HDU - 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 soothing wind send...

nucleare的博客 257

SCU 4429 frog's dice (二分匹配 or 网络流)

题目链接 4429: frog's dice Submit your solution     Discuss this problem     Best solutions Time: 2000ms The Problem frog has many dices:) Each dice has six surfaces and there is

madaidao的专栏 687

二分匹配

棋盘游戏 HDU - 1281 题目链接 行与列的二分匹配,暴力删除每一点求最新的二分匹配,比原先的小那就是重要点 #include <bits/stdc++.h> using namespace std; const int N = 100 + 5; struct node{ int x,y; }s[N * N]; int Map[N][N],vis[N],link[N]; int cnt[N]; bool dfs(int x,int m) { for (int i = 1;

zhe_zhenbuhui_a的博客 277

利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES

利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES

10年职场两茫茫,35岁凄凉奈若何 153

hdu 1068 Girls and Boys

最大二分匹配。 题目所求为最大独立集=n-最大匹配 Hopcroft-krap()算法: #include #include #include #include using namespace std; #define INF 10000000 queue q; int g[505][505]; int vis[505]; int distx[505],disty[505];

夜月 702

【HDU】2444 The Accomodation of Students 二分匹配

传送门:【HDU】2444 The Accomodation of Students 题目分析:能不能分成两个集合主要看这个图是否是一个二分图

poursoul 1077

Hdu 2389 Rain on your Parade

大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再tmin内移动到不同的雨伞处(不允许两个人共用一把伞)。 思路:很容易可以看出,这是一个二分图模型,雨伞和人一一对应,典型的匹配问题,而又要求最大,所以是二分最大匹配问题,再看看题目的数据量,nx:3000,ny:3000,极限情况下有9000000条边,很明显,匈牙利算法可能会TLE,所以为了降低时间复杂度

Wall_F的专栏 2177
上一篇: hdu 2819 Swap 二分图的最大匹配
下一篇: hdu 3517 Adopt or not(二分图最大独立集关键点)
bubbleoooooo
博客等级 码龄13年 52粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值