匈牙利算法 求最大匹配

不断找增广路,直到没有增广路,每找到一条增广路匹配数就加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 true;
}
}
}
return false;
}
void hungary(){
int cnt=0;
for(int i=1;i<=X;i++){
memset(vis,0,sizeof(vis));
if(dfs(i))cnt++;
}
}

匈牙利算法 求最大匹配,布布扣,bubuko.com

时间: 2024-08-03 10:46:22

匈牙利算法 求最大匹配的相关文章

匈牙利算法求最大匹配(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;

【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

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

无向图匈牙利算法求地的值除以2才是答案,因为每个边都匹配了两次,有向图算法得出的就是答案. #include<iostream> #include<cstdio> #include<cstring> using namespace std; int maps[50][50],match[50],vis[50],n; bool Find(int u) { cout<<"the fa = "<<u<<endl; for

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

[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一, 否则我们试图给原来匹配的y和x'重新找一个匹配,如果x'匹配成功,那么(x,y)就可以新增为一对合法的匹配. 给x'寻找匹配的过程可以递归解决. [接口] int hungary(); 复杂度O(|E|*sqrt(|V|)) 输入

hdu 1068 Girls and Boys(匈牙利算法求最大独立集)

Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7044    Accepted Submission(s): 3178 Problem Description the second year of the university somebody started a study on the roman

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

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

用匈牙利算法求二分图的最大匹配

转载大神的!! 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到.二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识):第二种就是我现在要讲的匈牙利算法.这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率.匈牙利算法其实很简单,但是网上搜不到什么说得清楚的文章.所以我决定要写一下. 最大流算法的核心问题就是找增广路径(augment path).匈牙利算法也不例外,它的基本模式就是: 初始时最大匹

poj3020 Antenna Placement 匈牙利算法求最小覆盖=最大匹配数(自身对应自身情况下要对半) 小圈圈圈点

/** 题目:poj3020 Antenna Placement 链接:http://poj.org/problem?id=3020 题意: 给一个由'*'或者'o'组成的n*m大小的图,你可以用一个小圈圈圈住两个相邻的'*',问要圈住所有的'*'最少需要多少个小圈圈.(小圈圈可以相交) 思路: 先尽量圈出能圈两个且不重复圈的'*'.剩下的没有圈的'*'一定需要用一个. 所以构造二分图,求最大匹配,结果:ans = 总的'*'数量-最大匹配数*2 + 最大匹配数 = 总的'*'数量-最大匹配数:

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]