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

 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                 // 如果是未盖点,说明交替路为增广路,则交换路径,并返回成功
 9                 matching[v] = u;
10                 matching[u] = v;
11                 return true;
12             }
13         }
14     }
15     return false; // 不存在增广路,返回失败
16 }
17
18 int hungarian()
19 {
20     int ans = 0;
21     memset(matching, -1, sizeof(matching));
22     for (int u=0; u < num_left; ++u) {
23         if (matching[u] == -1) {
24             memset(check, 0, sizeof(check));
25             if (dfs(u))
26                 ++ans;
27         }
28     }
29     return ans;
30 }
31 //https://www.cnblogs.com/wangjunyan/p/5563154.html
32 //上面是临界表,下面邻接矩阵
33
34
35 //二分图
36 #define maxn 10//表示x集合和y集合中顶点的最大个数!
37  int nx,ny;//x集合和y集合中顶点的个数
38  int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配
39  int cx[maxn],cy[maxn];//用来记录x集合中匹配的y元素是哪个!
40  int visited[maxn];//用来记录该顶点是否被访问过!
41  int path(int u)
42  {
43      int v;
44      for(v=0;v<ny;v++)
45      {
46          if(edge[u][v]&&!visited[v])
47          {
48              visited[v]=1;
49             if(cy[v]==-1||path(cy[v]))//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路
50              {
51                  cx[u]=v;
52                  cy[v]=u;
53                  return 1;
54              }
55          }
56      }
57      return 0;
58  }
59  int maxmatch()
60  {
61      int res=0;
62      memset(cx,0xff,sizeof(cx));//初始值为-1表示两个集合中都没有匹配的元素!
63      memset(cy,0xff,sizeof(cy));
64      for(int i=0;i<=nx;i++)
65      {
66          if(cx[i]==-1)
67          {
68              memset(visited,0,sizeof(visitited));
69              res+=path(i);
70          }
71      }
72      return res;
73  }
74  //https://www.cnblogs.com/shenben/p/5573788.html

原文地址:https://www.cnblogs.com/xiaobuxie/p/11391871.html

时间: 2024-09-28 09:16:16

【模板】 二分图最大匹配和匈牙利算法的相关文章

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中节点

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

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

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

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

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

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

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

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

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

#include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using namespace std; int n,m,g[maxn][maxn],ans,f[maxn],match[maxn]; int init() { int x=0;char s;s=getchar(); while(s<'0'||s>'9')s=getchar(); while(s>='0'&am