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

以下第一张图是洛谷的模板题使用匈牙利的情况。

第二张是使用 Hopcroft-Karp的情况。

代码不记得是不是模板题的代码,但是searchPath和 Find, MaxMatch是模板。

//Hopcroft-Karp 算法 时间复杂度为O(n^(1/2)*m)
//该算法是对匈牙利算法的优化,利用匈牙利算法一次只能找到一条增广路径,
//Hopcroft-Karp就提出一次找到多条不相交的增广路径(不相交就是没有公共点和公共边的增广路径),称为增广路集
//然后根据这些增广路径添加多个匹配,并逐渐增加增广路径集中增广路径的长度。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <vector>
//#include <map>
#include <queue>
#include <set>
#define MAX 3003
#define INF 0x3f3f3f3fusing namespace std;
int nextLeft[MAX],nextRight[MAX];   //nextLeft[MAX]是左集合匹配右集合的点,同理nextRight也是
int dLeft[MAX],dRight[MAX];         //dLeft[MAX],dRight[MAX]是增广路径长度,或者说BFS深度
int dx[MAX],dy[MAX];
int map[MAX][MAX];                  //map[MAX][MAX]存图
int nx,ny;                          //nx,ny分别是左集合点个数,右集合点个数
int dis;
int vis[MAX];                       //标记数组.bool searchPath() {                  //寻找增广路径集,其增广路径集中每条增广路径长度一样queue<int>Q;dis = INF;memset(dLeft,-1,sizeof(dLeft));memset(dRight,-1,sizeof(dRight));for (int i = 1;i <= nx; i++) {   //在BFS中宽度搜索if (-1 == nextLeft[i]) {   //将未遍历的节点 入队 并初始化次节点距离为0 Q.push(i);dLeft[i] = 0;}}while (!Q.empty()) {         //广度搜索增广路径int u = Q.front();Q.pop();if (dLeft[u] > dis) break;for (int v = 1; v <= ny; v++) {    //取右侧节点 if (map[u][v] && -1==dRight[v]) { //右侧节点的增广路径的距离dRight[v] = dLeft[u]+1;         //v对应的距离 为u对应距离加1if (-1 == nextRight[v])  dis = dRight[v];else {dLeft[nextRight[v]] = dRight[v]+1;Q.push(nextRight[v]);}}}}return dis != INF;
}
bool Find(int u) {              //Find函数,对增广路径集进行增广。for (int v = 1; v <= ny; v++) {if (!vis[v] && map[u][v] && dRight[v] == dLeft[u]+1) {vis[v] = 1;if (nextRight[v] != -1 && dRight[v] == dis)    continue;if (-1 == nextRight[v] || Find(nextRight[v])) {nextRight[v] = u;nextLeft[u] = v;return true;}}}return false;
}
int MaxMatch() {int ans(0);memset(nextRight,-1,sizeof(nextRight));memset(nextLeft,-1,sizeof(nextLeft));while(searchPath()) {        //不断进行增广路径集的操作,其增广路径也不断增长。memset(vis,0,sizeof(vis));for (int i = 1; i <= nx; i++) {if (-1 == nextLeft[i]) {if (Find(i)) ans++;}}}return ans;
}int main(int argc,char *argv[]) {// int n,m,e;int e;scanf("%d%d%d", &nx,&ny,&e);for (int i = 1; i <= e; i++) {int u,v;scanf("%d%d", &u,&v);if (u>=1&&u<=nx&&v>=1&&v<=ny) {map[u][v] = 1;}}printf("%d\n", MaxMatch());return 0;
}

Hopcroft-Karp 算法相关推荐

  1. C++实现hopcroft karp霍普克洛夫特-卡普算法(附完整源码)

    C++实现hopcroft karp霍普克洛夫特-卡普算法 C++实现hopcroft karp霍普克洛夫特-卡普算法完整源码(定义,实现,main函数测试) C++实现hopcroft karp霍普 ...

  2. C++Rabin Karp算法字符串快速查找(附完整源码)

    C++Rabin Karp算法字符串快速查找 C++Rabin Karp算法字符串快速查找完整源码(定义,实现,main函数测试) C++Rabin Karp算法字符串快速查找完整源码(定义,实现,m ...

  3. Hopcroft–Karp algorithm

    In computer science, the Hopcroft–Karp algorithm (sometimes more accurately called the Hopcroft–Karp ...

  4. Rabin Karp 算法详解及Python实现

    目录 一.Rabin Karp 核心思路 二.字符串如何做哈希映射 三.借助前缀和列表计算滑动窗口 四.leetcode28. 代码实现 Rabin Karp 算法是用于实现字符串的模式匹配,先看le ...

  5. leetcode 1044. Longest Duplicate Substring | 1044. 最长重复子串(Rabin Karp算法)

    题目 https://leetcode.com/problems/longest-duplicate-substring/ 题解 这题暴力超时,看了 Related Topics,以及 Hint,主要 ...

  6. C#,图论与图算法,二分图(Bipartite Graph)的霍普克罗夫特-卡普(Hopcroft Karp)最大匹配算法与源程序

    二分图Bipartite graph 有没有可能通过数学过程找到你的灵魂伴侣?大概让我们一起探索吧! 假设有两组人注册了约会服务.在他们注册后,会向他们展示另一组人的图像并给出他们的描述.他们被要求选 ...

  7. 多目标跟踪之匈牙利算法

    0 前言 目标跟踪(Object Tracking)是自动驾驶中非常常见的任务,根据跟踪目标数量的不同,目标跟踪可分为: 单目标跟踪(Single Object Tracking,SOT) 多目标跟踪 ...

  8. C++ edmond karp和ford fulkerson求最大流算法(附完整源码)

    C++实现hopcroft karp霍普克洛夫特-卡普算法 C++实现hopcroft karp霍普克洛夫特-卡普算法完整源码(定义,实现,main函数测试) C++实现hopcroft karp霍普 ...

  9. ICPC-图论知识与算法要览

    1.图定义(Definitions in graph theory) 1)图(Graph) 2)有向图(Directed graph) 3)图数据表示 邻接矩阵(Adjacency Matrix),邻 ...

  10. 10种算法一文打尽!基本图表算法的视觉化阐释

    图源:unsplash 来源:读芯术 在社交媒体网络.网页和链接.GPS中位置和路线等真实场景中,图表已成为一种强大的建模和捕获数据手段,如果一组对象相互关联,则可以用图表来表示. 本文就将简要解释1 ...

最新文章

  1. Linux下搭建jenkins+svn+http+maven自动化部署
  2. Intellij Idea 从 Svn 检出 Maven 项目、部署 Tomcat 运行
  3. 求助:现在有一个可以进体制“养老”的坑,我该不该跳?
  4. Android之不需要自定义View(ViewfindView.java)最简单的二维码扫描
  5. wordpress 调整段落空两,段落间的距离
  6. 面向IT专业人员的8个新兴AI工作
  7. Solaris下怎样改动文件创建时间及查询
  8. ffmpeg 2.6.3在Linux下的编译
  9. Redis基本操作——队列 List(原理篇)
  10. 2021-2025年中国成人脊柱矫形器行业市场供需与战略研究报告
  11. LINUX安装TensorRT及特别注意事项
  12. 腾讯手机管家(android2.3),腾讯手机管家3.4 Android发布_软件资讯软件快报-中关村在线...
  13. 揭秘AI创业江湖里的“师徒帮”:同门师兄弟搭档 导师坐镇后方
  14. LCA的 Trajan 算法
  15. 【WIN10】PS/2 标准键盘鼠标带感叹号(代码10,39)(适用于红米G)
  16. ffmpeg 10bit 8bit yuv格式转换
  17. OpenCV-Python实现有参照物条件下的长方形物体尺寸推算(可实时、附源码)
  18. 千呼万唤始出来,犹抱琵琶半遮面——python变量和数据类型
  19. 近期DDG挖矿病毒防护与分析
  20. Python plot() 画图标记 marker

热门文章

  1. windows7更换系统时间服务器,Windows7系统更改时间同步服务器
  2. 摩托罗拉被google收购了
  3. mysql的Event权限_mysql8 参考手册-事件调度程序和MySQL特权
  4. 神经网络中的网络优化和正则化(三)之超参数优化
  5. 用while实现一个简单的猜数字小游戏
  6. 计算机基础课小论文,计算机基础课程论文参考文献大全 哪里有计算机基础课程参考文献...
  7. 开发一套在线纸笔系统,随时随地在线写春联
  8. 老婆为什么是别人的好?
  9. 【华为OD机试真题 python】天然蓄水库【2023 Q1 | 100分】
  10. PFP:面向材料发现的通用神经网络