【模板】二分图最大匹配(匈牙利算法)/洛谷P3386

1|0题目链接

https://www.luogu.com.cn/problem/P3386

2|0题目大意

给定一个二分图,其左部点的个数为 n,右部点的个数为 m,边数为 e,求其最大匹配的边数。

左部点从 1n 编号,右部点从 1m 编号。

3|0题目解析

二分图最大匹配,一般用匈牙利算法完成。
匈牙利算法的本质,其实是不断尝试新匹配,修改旧匹配的 DFS
点数为 n,边数为 m
时间复杂度: O(nm)

题目中采用了数组邻接表的存图方法,v[x] 表示新一轮是否访问数组,设成 i ,可以免去每轮清空数组的 memset

4|0参考代码

#include <cstdio> using namespace std; int n, m, e, a, b, ans=0; int h[1005], v[1005], p[1005]; struct AB{ int a, b, n; } d[1000005]; int match(int a) { for (int j = h[a]; j ! =0; j = d[j].n) { int t = d[j].b; if (v[t] != i) { v[t] = i; if (!p[t] || match(p[t])) { p[t] = a; return 1; } } } } int main() { scanf("%d%d%d",&n, &m, &e); for (int i = 1; i <= e; ++i) { scanf("%d%d",&a, &b); if (b > m) continue; d[i].a = a; d[i].b = b; d[i].n = h[a]; h[a] = i; } for (int i = 1; i <= n; ++i) { if (match(i)) ans++; } printf("%d\n",ans); return 0; }

感谢支持!


__EOF__

本文作者炯炯目光
本文链接https://www.cnblogs.com/jjmg/p/13709530.html
关于博主:KTH 信息与网络工程硕士在读
版权声明:欢迎分享或转载
声援博主:To be or not to be, is a question.
posted @   Chiron-zy  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示