二分图最大匹配的匈牙利算法伪代码

值得一提的是,用于标记的数组 book (代码中简写为了 bok)的每次清空,无论是调用 memset 函数

还是手写循环来清零,都会耗费大量时间。

而这一步骤可以通过用 int book 而非 bool book 来设置一个额外的标记 id ,避免了清空操作耗时。

具体的实现非常简单,参看代码。

 1 bool find(int node, int id)
 2 {
 3     for (int p = fst[node]; p; p = nxt[p]) {
 4         if (bok[v[p]] == id)
 5             continue;
 6         bok[v[p]] = id;
 7         if (lnk[v[p]] && !find(lnk[v[p]], id))
 8             continue;
 9         lnk[v[p]] = node;
10         return true;
11     }
12     return false;
13 }
14
15 int main()
16 {
17     /* input */
18
19     for (i = 1; i <= n; ++i)
20         ans += find(i, i);
21     printf("%d\n", ans);
22     return 0;
23 }
时间: 2024-09-28 22:35:26

二分图最大匹配的匈牙利算法伪代码的相关文章

hihoCoder #1122 : 二分图二?二分图最大匹配之匈牙利算法

#1122 : 二分图二•二分图最大匹配之匈牙利算法 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了.因为过年时间并不是很长,所以姑姑希望能够尽可能在一天安排比较多的相亲.由于一个人同一天只能和一个人相亲,所以要从当前的相亲情况表里选择尽可能多的组合,且每个人不会出现两次.不知道有没有什么好办法,对于当前给定的相亲情况表,能够算出最多能同时

它处资料:二分图最大匹配的匈牙利算法

资料出处:点击打开链接 匈牙利算法 二分图最大匹配的匈牙利算法:  二分图是这样一个图,它的顶点能够分类两个集合X和Y,全部的边关联在两个顶点中.恰好一个属于集合X.还有一个属于集合Y. 最大匹配: 图中包括边数最多的匹配称为图的最大匹配. 完美匹配: 假设全部点都在匹配边上.称这个最大匹配是完美匹配. 最小覆盖: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和当中一个点关联.能够证明:最少的点(即覆盖数)=最大匹配数 最小路径覆盖: 用尽量少的不相交简单路径覆盖有向无环图G的全

&quot;《算法导论》之‘图’&quot;:不带权二分图最大匹配(匈牙利算法)

博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利算法 1. 前言 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U.V中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.

HDU ACM 1281 棋盘游戏-&gt;二分图最大匹配(匈牙利算法实践)

分析:该題可以用x坐标去匹配y坐标,匹配成功一次就是一个可放棋子的点,最后求得的的二分图最大匹配就是可以放的最大棋子数.求二分图的最大匹配使用匈牙利算法.之后通过删除一条边来判断一个点是否为关键点,若删边后,最大匹配数不变则不是,否则是,通过分别删除每个点进行测试,最终即可算出关键点的个数. #include<iostream> using namespace std; #define N 102 int map[N][N]; //记录连接x和y的边 bool vis[N]; //记录y中节点

算法练习系列—hiho1122二分图最大匹配之匈牙利算法

题目地址:http://hihocoder.com/problemset/problem/1122 该题目的关键是2个问题:1点用bfs构造二分图   2:针对二分图的其中S中的结点,遍历找增广路(匈牙利算法求二分图的最大匹配) 每找到一条增广路就多找到了一条匹配. 代码如下: /* 这题有两点需要注意:1点用bfs构造二分图 2:针对二分图的其中S中的结点,遍历找增广路(匈牙利算法求二分图的最大匹配) 每找到一条增广路 就多找到了一条匹配 */ #include <iostream> #in

51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左边的点和没用过的右边的点连起来, 如果遇到一个点已经连过就试着把原来的拆掉 把现在这条线连起来看能不能多连上一条线. 总结来说就是试和拆,试的过程很简单,拆的过程由于使用递归写的,很复杂.很难讲清楚,只能看代码自己理会. 代码(有注释): #include <bits\stdc++.h> usin

二分图最大匹配(匈牙利算法)

首先是二分图定义与判断  http://www.cnblogs.com/wenruo/p/5243034.html 给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不连接同一个顶点,则称M是一个匹配. 一个很好的比喻是,一个二分图,左边代表男生,右边代表女生,连线代表有好感,匹配就是把他们互相有好感的撮合起来.当然,要一夫一妻! 所谓最大匹配,就是撮合最多对.(写下这句话的时候,我在图书馆,旁边有一对情侣在虐狗……) 完美匹配就是所有的人都不落单. 上图红线代表一个匹配,图中

hihocoder 1122 二分图最大匹配之匈牙利算法

题目链接:http://hihocoder.com/problemset/problem/1122 , 匈牙利算法裸题. 刚刚学的二分匹配,还是要多刷题. 这道题可以直接套模板,我是根据题目上面的来做的,所以就先加了个染色优化,效果一般吧. #include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cmath> #include <s

【模板】 二分图最大匹配和匈牙利算法

1 bool dfs(int u) 2 { 3 for (iterator_t i = G[u].begin(); i != G[u].end(); ++i) { // 对 u 的每个邻接点 4 int v = edges[*i].to; 5 if (!check[v]) { // 要求不在交替路中 6 check[v] = true; // 放入交替路 7 if (matching[v] == -1 || dfs(matching[v])) { 8 // 如果是未盖点,说明交替路为增广路,则交