匈牙利算法 二分图最大匹配题模板

【任务】

给定一个二分图,用匈牙利算法求这个二分图的最大匹配数。

【说明】

求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配。

我们一次枚举左边的点x的所有出边指向的点y,

若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一,

否则我们试图给原来匹配的y和x‘重新找一个匹配,如果x‘匹配成功,那么(x,y)就可以新增为一对合法的匹配。

给x‘寻找匹配的过程可以递归解决。

【接口】

int hungary();

复杂度O(|E|*sqrt(|V|))

输入: n    全局变量,左侧的点数

      g    全局变量,g[i]表示与左边点i相连的右边的点

输出:tot     最大匹配数

   from    全局变量,from[i]表示最大匹配图中与左边点i相连的边 

【代码】

//输入:
const  int MAXN = 555; // 数组长度
int n = 200; //n表示左侧的点数
vector <int> g[MAXN];  // 表示与左边点i相连的右边点

//输出:
int from[MAXN];//表示最大匹配中与左边点i相连的边
int tot;  // 二分图最大匹配数

bool use[MAXN]; // 左边点的使用标记

//匈牙利算法 模板题 ,match和hungary见小红书ACM国际大学生程序设计竞赛 算法与实现
bool match(int x){
    for(int i = 0;i < g[x].size(); ++i){
        if(!use[g[x][i]]){
            use[g[x][i]] = true;
            if(from[g[x][i]] == -1 || match(from[g[x][i]])){
                from[g[x][i]] = x;
                return true;
            }
        }
    }
    return false;
}

int hungary(){
    tot = 0;
    memset(from,255,sizeof(from));
    for(int i = 1;i <= n; i++){
        memset(use,0,sizeof(use));
        if(match(i)) ++tot;
    }
    return tot;
}

这个我打算写给自己写题学习时用的,发出来供大家参考。

时间: 2025-01-02 04:33:10

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

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

poj1274 题意: 有n个奶牛, m个畜舍, 每个畜舍最多装1头牛,每只奶牛只有在自己喜欢的畜舍里才能产奶. 求最大产奶量. 分析: 其实题意很明显, 二分图的最大匹配, 匈牙利算法. #include<iostream> #include<cstdio> #include<string.h> #include<cstring> using namespace std; int n, m, sum, v[210], ans[210], map1[210]

匈牙利算法求最大匹配(HDU-4185 Oil Skimming)

如下图:要求最多可以凑成多少对对象 ? 大佬博客:https://blog.csdn.net/cillyb/article/details/55511666 模板: int link[maxn],vis[maxn]; bool dfs(int x) { for(int i = 1; i <= num; i++) { if(!vis[i] && cp[x][i]) { vis[i] = 1; if(link[i] == 0 || dfs(link[i])) { link[i] = x;

匈牙利算法 求最大匹配

不断找增广路,直到没有增广路,每找到一条增广路匹配数就加1 //hungary const int X=100,Y=100; int match[Y];// initial to -1 bool vis[Y]; int g[X][Y]; bool dfs(int x){ for(int y=1;y<=Y;y++){ if(g[x][y]&&!vis[y]){ vis[y]=1; if(match[y]==-1||dfs(match[y])){ match[y]=x; return t

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

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

Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文件:transform.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换序列T.如果有多个满足条

二分图最大匹配基本模板

最小顶点覆盖==二分图的最大匹配最少路径覆盖==n—最大匹配////n为左右集合中的顶点个数最大点独立集 = 顶点共个数 - 匹配顶点数 多个环的并?    例如:有n个国家,国家之间通过有向边相连,边有权值,?    现在让你把所有的国家都划成一个一个的圈,使得所有圈的总权值和最大.?    二分图的实质就是多个环,该题就是直接求出的二分图的最大权匹配就能求出最终结果.?    二分图的多个环的并就是二分图的最大(小)权匹配.?    所以KM求得最大匹配就是结果////////下面给出关于二

【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students

http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 8 using namespace std; 9 const int maxn=2e2

hdu2063 匈牙利算法 二分最大匹配模版题

过山车 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或P

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

#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n,m,k,ans,cnt,head[1001],vis[1001],match[1001]; struct uio{ int next,to; }edge[1000001