ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

匈牙利算法

2022-03-27 12:01:01  阅读:174  来源: 互联网

标签:二分 匹配 int 匈牙利 st 算法 match


这就是NTR算法 ?? 渣男渣女算法 ??

接下来要介绍的NTR算法,啊呸,不对不对,匈牙利算法,是一种确定二分图的最大匹配数量的一种非常高效的算法;

我们先介绍一下二分图的匹配以及最大匹配:

二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。

二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。

 

换言之,二分图的匹配就是点与点之间一 一对应,最大匹配就是一 一对应的个数能有多大;

 

接下来,我们将介绍y总的奇妙比喻:我们把不同点集之间的匹配比作男女生找对象,就假设左边是男生,右边是女生好了,如果两者之间有一条边,就说明这俩互相有crush,能撮合到一起;

我们的角色就是月老,我们想让尽可能多的情侣出现,所以我们遍历男生,这个男生的所有边都是可能是他的女朋友,如果从上往下看他crush的女生,如果这个女生is taken了,我们就去看她男朋友能不能换一个(没错!明目张胆的NTR,给喜欢的对象的对象找对象),如果能,就让那个男的换一个,这个就归他了,如果换不了,就只能找下一个了;或者这个女生is single,就可以直接成了!

这样的话,整体的情侣就能达到最多的情况,我们画个图来表示一下,下面的黑线表示互相之间有crush,红线表示成了,绿线说明被绿了hh!

 

 

OK,这就是关于匈牙利算法的基本思路了,他的时间复杂度,在最坏最坏的情况下是O(nm)的,但一般都不会有这种情况,还是很快的!

 

代码:

#include<bits/stdc++.h>
#define maxn 510
#define maxm 100010

using namespace std;
int h[maxn],e[maxm],ne[maxm],idx;
int match[maxn];
int n1 , n2 ,m;
bool st[maxn];

void add(int a,int b){
e[idx] = b; ne[idx] = h[a] ; h[a] = idx++;
}

bool find(int x){
for(int i = h[x];i!=-1;i = ne[i]){
int j = e[i];
if(!st[j]){
st[j] = true;
if(match[j] == 0 || find(match[j])){
match[j] = x;
return true;
}
}
}
return false;
}

int main()
{
memset(h, -1, sizeof h);
cin >> n1 >> n2 >> m;
while (m -- ){
int u,v;
cin >> u >> v;
add(u , v);
}
int res = 0;
for(int i = 1;i<=n1;i++){
memset(st, false, sizeof st);
if(find(i)) res++;
}
cout << res << '\n';
return 0;
}

标签:二分,匹配,int,匈牙利,st,算法,match
来源: https://www.cnblogs.com/ZheyuHarry/p/16062382.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有