1 /*==================================================*\
 2  |  二分图匹配(匈牙利算法DFS 实现)
 3  | INIT: g[][]邻接矩阵;
 4  | CALL: res =  MaxMatch ();
 5  |  优点:实现简洁容易理解,适用于稠密图,DFS 找增广路快。
 6  | 找一条增广路的复杂度为O(E ),最多找V 条增广路,故时间复杂度为O(VE)
 7  \*==================================================*/
 8 const int MAXN = 1000;
 9 int uN, vN; // u, v 数目,要初始化!!!
10 bool g[MAXN][MAXN]; // g[i][j] 表示xi与yj相连
11 int xM[MAXN], yM[MAXN]; // 输出量
12 bool chk[MAXN]; //  辅助量检查某轮y[v]是否被check
13 bool SearchPath(int u) {
14     int v;
15     for (v = 0; v < vN; v++)
16         if (g[u][v] && !chk[v]) {//如果u到v是相连的,且v还没有用
17             chk[v] = true;
18             if (yM[v] == -1//第一次,用到了短路计算,否则SearchPath(-1)会出问题
19                     || SearchPath(yM[v])) {
20                 yM[v] = u;
21                 xM[u] = v;
22                 return true;
23             }
24         }
25     return false;
26 }
27 int MaxMatch() {
28     int u, ret = 0;
29     memset(xM, -1, sizeof(xM));
30     memset(yM, -1, sizeof(yM));
31     for (u = 0; u < uN; u++)
32         if (xM[u] == -1) {//u还没有匹配过
33             memset(chk, false, sizeof(chk));//保证每次都置成false
34             if (SearchPath(u))
35                 ret++;
36         }
37     return ret;
38 }

引用Matrix67的一段关于匈牙利算法的经典通俗解释:

  研究了几个小时,终于明白了。说穿了,就是你从二分图中找出一条路径来,让路径的起点和终点都是还没有匹配过的点,并且路径经过的连线是一条没被匹配、一条已经匹配过,再下一条又没匹配这样交替地出现。找到这样的路径后,显然路径里没被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。不断执行上述操作,直到找不到这样的路径为止。

转载于:https://www.cnblogs.com/kakamilan/archive/2012/07/13/2590784.html

二分图匹配匈牙利算法DFS实现相关推荐

  1. nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  2. 二分图匹配--匈牙利算法

    文章目录 二分图: 匹配 匈牙利算法 代码: 二分图: 二分图是一个无向图,点集分成子集X和Y,图中每一条边都是一边在X一边在Y 当且仅当无向图G的每一个回路次数都是偶数时(包括0),G就是一个二分图 ...

  3. 二分图匹配——匈牙利算法

    匈牙利算法 什么是匈牙利算法 匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法.美国数学家哈罗德·库恩于1955年提出该算法.此算法之所以被称作匈牙利算法,是因 ...

  4. 二分图匹配-匈牙利算法

    说到二分,我们就很容易想到二分查找算法,今年下半年--,今天所介绍的二分图和二分查找没有太大的联系,我们先来看一下它的定义: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图 ...

  5. Codevs 1222 信与信封问题 二分图匹配,匈牙利算法

    题目: http://codevs.cn/problem/1222/ 1222 信与信封问题   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 钻石 Diamond 题解 ...

  6. 【CF1139E】Maximize Mex - 二分图匹配 - 匈牙利算法

    [题目链接] https://www.luogu.com.cn/problem/CF1139E [题目描述] 有n个学生,第i个学生在俱乐部c_i,并拥有一个能力值a_i.在接下来的d天中,每天会有一 ...

  7. HDU 2063 过山车 二分图匹配 匈牙利算法

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. 二分图匹配----匈牙利算法之二

    poj 1469 COURSES //题意:现在有p门课程和n个学生,现在需要有由p个学生组成的组织,该组织满足每个学生代表一门课程以及每门课程只能由一个学生代表, //现给出每门课程都有哪些学生可以 ...

  9. 二分图的匹配——匈牙利算法

    什么是匹配 匹配:在图论中,一个「匹配」是一个边的集合,其中任意两条边都没有公共顶点. 最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配. 二分图的匹配:给定一个二分图G,在G ...

最新文章

  1. 矩阵快速幂+构造方法
  2. Android之系统自带的文字外观设置
  3. restful-api最佳实践
  4. 北京大学Tensorflow2.0笔记
  5. 【Scikit-Learn 中文文档】支持向量机 - 监督学习 - 用户指南 | ApacheCN
  6. 白话SOA:面向服务+组件+架构
  7. Java关于中查询数据时,报错java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 -> 1的问题
  8. java public interface_Java 接口interface的基础
  9. 运行Map Reduce报错Got exception: java.net.ConnectException: Call From master.localdomain/127.0.0.1 to
  10. css实现毛玻璃效果——backdrop-filter
  11. 计算机文化学习笔记3
  12. html中打印部分内容,设置网页打印区域
  13. LaTeX入门级教程
  14. [学位]燕山大学中文学术期刊目录(2020修订版)
  15. 爬虫项目实战二:爬取起点小说网
  16. 搭建react项目并配置路由
  17. webview的java与js互操作
  18. 关于网络推广的一些心得体会
  19. 华为云构建云原生DevSecOps平台,保障软件供应链全流程安全可信
  20. flv转换成mp4格式最简单方法

热门文章

  1. 同步等待 异步等待_异步/等待和承诺的解释
  2. 如何使用Python创建,读取,更新和搜索Excel文件
  3. 【廖雪峰Python学习笔记】字符串与编码
  4. 文件服务器的内存要多少,文件服务器内存要多大
  5. ssh mysql环境搭建 myeclipse_MyEclipse整合ssh三大框架环境搭载用户注册源码下载
  6. 应用设计模式进行重构来消除坏味道
  7. 根据给定数据创建JSON并验证
  8. 集成测试_渐增与非渐增模式优缺点
  9. Excel VBA 教程
  10. 深入解析:TRUNCATE TABLE 的内部原理解析与恢复思路