匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs

于是用到了dfs模板

寻找二分图最大匹配的算法是匈牙利算法

匈牙利算法的主要程序是寻找增广路

寻找增光路是过程是:从一个未经配对的点出发,历经未配边、匹配边、未配边、匹配边、未配边、...最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了。这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5
 6 struct Edge{
 7     int to,nxt;
 8     Edge(int to=0,int nxt=0):
 9         to(to),nxt(nxt){}
10 };
11
12 const int maxn=2005,maxm=1000005;
13
14 Edge E[maxm<<1];
15 int head[maxn],mat[maxn];
16 bool check[maxn];
17 int n,n_l,n_r,m,cnt=0;
18
19 bool dfs(int u){
20     for(int e=head[u];e;e=E[e].nxt){
21         int v=E[e].to;
22         if(!check[v]){
23             check[v]=1;
24             if(mat[v]==-1||dfs(mat[v])){
25                 mat[v]=u;
26                 mat[u]=v;
27                 return 1;
28             }
29         }
30     }
31     return 0;
32 }
33
34 void hungarian(){
35     int ans=0;
36     memset(mat,-1,sizeof mat);
37     for(int u=1;u<=n_l;u++)
38         if(mat[u]==-1){
39             memset(check,0,sizeof check);
40             if(dfs(u))  ans++;
41         }
42     printf("%d\n",ans);
43 }
44
45 inline void ad_e(int from=0,int to=0){
46     E[++cnt]=Edge(to,head[from]);
47     head[from]=cnt;
48     E[++cnt]=Edge(from,head[to]);
49     head[to]=cnt;
50 }
51
52 void init(){
53     scanf("%d%d%d",&n_l,&n_r,&m);
54     for(int i=0,ff,tt;i<m;i++){
55         scanf("%d%d",&ff,&tt);
56         if(tt>n_r)  continue;
57         ad_e(ff,tt+n_l);
58     }
59 }
60
61 int main(){
62     init();
63     hungarian();
64     return 0;
65 }
时间: 2024-10-12 00:23:06

匈牙利算法dfs模板 [二分图][二分图最大匹配]的相关文章

二分图最大匹配(匈牙利算法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

dfs模板 二部图的最大匹配

/**************************************************** 二分图匹配(匈牙利算法的DFS实现) INIT:g[][]两边定点划分的情况 CALL:res=hungary();输出最大匹配数 优点:适于稠密图,DFS找增广路快,实现简洁易于理解 时间复杂度:O(VE); 适用范围: 二分图的 最小顶点覆盖 ==== 最大匹配 DAG图的 最小路径覆盖数 == 节点数 – 最大匹配数 二分图的 最大独立集数 = 节点数 – 最大匹配数 *******

【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs

都是经典题了吧..我好无聊.. 4806 4806-1801是双倍经验..DP方程看代码吧.. 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 9 #define

(匈牙利算法DFS)hdu 3729

I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1542    Accepted Submission(s): 769 Problem Description After this year’s college-entrance exam, the teacher did a survey in

匈牙利算法(模板)

预处理 二维数组 map[N][N];用来记录两点是否可以链接 一维数组 link[N];用来记录有哪个点占用了哪个点 一维数组 ok[N];判断点是否被用过 bool dfs(int a) { for(int i=0;i<N;i++)遍历后数组寻找有是否可以相连的 { 如果 没有相连并且没有被用过 那么 标记被用过并且进行下一步操作 判断一下这个点被占用 如果没有被占用 则记录这个点被a占用 返回真 表示a点找到对应点了 否则 重新调用一下dfs(link[i]) 如果返回值为真表示 在这个点

poj-1469-COURSES-二分图匹配-匈牙利算法(模板)

题意:N个学生,P个课程,问能不能找到课程的P个匹配. 思路:[早上睡醒了再写] 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 const int maxn = 555; 7 int n, p; 8 vector<int> g[maxn]; 9 int from[maxn

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

给定一个二分图,其中左半部包含n1n1个点(编号1~n1n1),右半部包含n2n2个点(编号1~n2n2),二分图共包含m条边. 数据保证任意一条边的两个端点都不可能在同一部分中. 请你求出二分图的最大匹配数. 二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数. 输入格式 第一行包含三个整数 n1n1. n2n2 和 mm. 接下

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

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

(转)二分图的最大匹配、完美匹配和匈牙利算法

转载自http://www.renfei.org/blog/bipartite-matching.html 二分图的最大匹配.完美匹配和匈牙利算法 这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm):不讲带权二分图的最佳匹配. 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是