当前位置: 首页 > news >正文

洛谷 P3386:【模板】二分图最大匹配 ← 匈牙利算法

【题目来源】
https://www.luogu.com.cn/problem/P3386

【题目描述】
给定一个二分图,其左部点的个数为 n,右部点的个数为 m,边数为 e,求其最大匹配的边数。
左部点从 1 至 n 编号,右部点从 1 至 m 编号。

【输入格式】
输入的第一行是三个整数,分别代表 n,m 和 e。
接下来 e 行,每行两个整数 u,v,表示存在一条连接左部点 u 和右部点 v 的边。

【输出格式】
输出一行一个整数,代表二分图最大匹配的边数。

【输入样例一】
1 1 1
1 1

【输出样例二】
1

【输入样例二】
4 2 7
3 1
1 2
3 2
1 1
4 2
4 1
1 1

【输出样例二】
2

【数据规模与约定】
对于全部的测试点,保证:
1≤n,m≤500,1≤e≤5×10^4。
1≤u≤n,1≤v≤m。
不保证给出的图没有重边。

【算法分析】
● 二分图的概念:如果无向图 G=(V, E) 的所有点可以分为两个集合 V1,V2,所有边都在 V1 与 V2 之间,且 V1,V2 的内部都没有边,则称 G 是一个二分图。

● 一个图是否为二分图,一般用“染色法”进行判断。染色法的核心思想非常直观:尝试用两种颜色对图中的所有顶点进行着色,并确保‌任何一条边两端的顶点颜色都不相同‌。如果能成功完成着色,则该图是二分图;否则,不是。

● 染色法的算法流程通常基于 BFS 或 DFS 实现。
(1)选择一种颜色(如 0)作为起始颜色。
(2)从一个未访问的节点开始,将其染色,然后遍历其所有邻居。
(3)若邻居未染色,则将其染成与当前节点相反的颜色(如 1),并递归(DFS)或入队(BFS)处理。
(4)若邻居已染色,则检查其颜色是否与当前节点相反。若颜色相同,则说明存在奇环,该图不是二分图。

● 匈牙利算法是解决“二分图最大匹配”问题的专精算法,由匈牙利数学家 Edmonds 于 1965 年提出,其主要功能是「求二分图的最大匹配的数量」。

● 匈牙利算法的冲突处理逻辑
设集合 U 和 V 为二分图的两个顶点集,M 为当前匹配集合。当元素 x∈U 需要与元素 y∈V 匹配,但 y 已与元素 z∈U 匹配时,算法的冲突处理逻辑为:
(1)检查元素 z 能否与集合 V 中其他元素 c(c≠y)形成新的匹配。
(2)若存在这样的元素 c,则将匹配关系调整为 (z,c) 和 (x,y)。
(3)若不存在,则继续为 x 寻找 V 集合中的其他匹配候选。

冲突处理

显然,匈牙利算法冲突处理的逻辑是“后来者居上”、“腾位子

● 匈牙利算法的示例
俗话说,“男女搭配,干活不累”。已知二分图的一部分是“男生集合”,另一部分是“女生集合”。若把具有好感的男女生匹配为“干活搭子”,请问最多能匹配成多少对儿?这就是匈牙利算法要解决的问题。(备注:具有好感的男女生已用线在二分图中进行了连接)

男生女生01

(1)遍历到 1 号男生,发现他和 2 号女生具有好感。因此,将他俩连一条红线配成“干活搭子”。

男生女生02

(2)遍历到 2 号男生,发现他和 1 号女生具有好感,因此,将他俩连一条红线配成“干活搭子”。

男生女生03

(3)遍历到 3 号男生,发现他和 2 号女生具有好感,但是 2 号女生已经和 1 号男生配对了。
怎么办?观察易知,1 号男生还和 4 号女生具有好感。那么问题就简单了。解决方法是给 1 号男生和 2 号女生连一条绿线,标示他们分开。然后再把 1 号男生和 4 号女生连一条红线配成“干活搭子”,3 号男生和 2 号女生连一条红线配成“干活搭子”。此番操作,都有配对,皆大欢喜。

男生女生04

(4)遍历到 4 号男生,发现他和 3 号女生具有好感。因此,将他俩连一条红线配成“干活搭子”。最后,获得最大匹配数量为 4 对。

男生女生05


【算法代码】

#include <bits/stdc++.h>
using namespace std;const int N=5e2+5,M=5e4+5;
int e[M],ne[M],h[N],idx;
int mate[N],st[N];void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}bool HA(int u) { //Hungarian Algorithmfor(int i=h[u]; i!=-1; i=ne[i]) {int j=e[i];if(!st[j]) {st[j]=true;if(!mate[j] || HA(mate[j])) {mate[j]=u;return true;}}}return false;
}int main() {memset(h,-1,sizeof h);int n,m,e;cin>>n>>m>>e;while(e--) {int u,v;cin>>u>>v;add(u,v);}int cnt=0;for(int i=1; i<=n; i++) {memset(st,false,sizeof st);if(HA(i)) cnt++;}cout<<cnt<<endl;return 0;
}/*
in:
4 2 7
3 1
1 2
3 2
1 1
4 2
4 1
1 1out:
2
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/155283857
https://www.cnblogs.com/chenxiaoran666/p/Hungarian.html
https://www.cnblogs.com/lnchy/p/10139601.html
https://blog.csdn.net/wangqianqianya/article/details/81981933
https://blog.csdn.net/dark_scope/article/details/8880547
https://codeleading.com/article/15753372769/
https://www.luogu.com.cn/problem/P3386
https://ac.nowcoder.com/acm/contest/1083/D
http://poj.org/problem?id=1274
http://poj.org/problem?id=3692
https://www.acwing.com/problem/content/374/
http://acm.hdu.edu.cn/showproblem.php?pid=3605
https://mdnice.com/writing/34549e8c749b4683bf8765cbafb5bc36






 

http://www.gsyq.cn/news/63065.html

相关文章:

  • UWB汽车钥匙介绍
  • 2025 年最新推荐液位计厂家排行榜:聚焦投入式 / 磁致伸缩 / 防爆 / 防水 / 浮球液位计优质企业
  • 奥运赛事激情对决 体育竞技热血启航
  • Kafka在Spring Boot生态中的浅析与应用 - 教程
  • 2025 年最新屏蔽泵厂家排行榜:高温 / 自吸 / 化工等多类型屏蔽泵最新推荐,助力企业精准选品立式 / 液下 / 多级 / 维修 / 低温 / 液化气屏蔽泵推荐
  • 实验5 MapReduce初级编程实践
  • 2025 年液化气泵厂家最新推荐榜,聚焦技术创新与质量保障的优质品牌深度解析无密封/磁力/倒罐/双端面机械密封/屏蔽/增压液化气泵公司推荐
  • 中药品牌十强排名彰显实力,好医生以完整产业链布局未来
  • 【51单片机】【protues仿真】基于51单片机自动浇花强大的系统
  • 2025年定期排污扩容器生产商权威推荐榜单:电厂疏水扩容器/定连排疏水扩容器/定期排污疏水扩容器源头厂家精选
  • 不只是制药!中药品牌排行榜10强好医生,用石榴谱写产业富民传奇
  • 微波烘干设备哪家好?国内优质企业及业务解析
  • CF1985G-D-Function
  • 2025 年义乌商务礼品厂家最新推荐榜,全链条能力与定制服务双维度深度解析商务伴手礼/商务礼品网/定制商务礼品/商务福利礼品/商务实用礼品公司推荐
  • 2025企业智能BI与知识库本地化部署实力厂商全景透视:从BI私有化、AI知识库到DeepSeek专有方案,方案,谁在定义数据新基座?
  • 排名榜单重磅来袭,关注优质十大留学机构
  • 国际物流公司优选指南:国际物流主流企业综合对比分析
  • 2025年11月优质代运营公司TOP5推荐:Facebook、LinkedIn、TikTok、Google、INS等全平台覆盖
  • 综合评估结果公布,揭晓十大留学机构排名榜单
  • 深入解析:Flink 并行度与最大并行度从 0 到弹性扩缩容
  • 留学机构排行榜TOP10:2025申请季弯道超车就靠它!
  • 2025申请季“决胜关键”:十大留学中介深度解码
  • 剖析十大留学中介:从服务细节到成功案例综合指南
  • SpecKit 规范驱动开发
  • NOIP2025邮寄
  • 2025申请季十大留学机构争霸:文书决胜申请头筹
  • Windows服务器如何重新注册.Net4.0?
  • 牛客刷题-Day24
  • 实测有效!有抗衰效果的口服产品,30+内调抗衰宝藏清单
  • 2025 美国货代公司排行榜:权威测评与中美专线优选指南