匈牙利算法

861. 二分图的最大匹配

给定一个二分图,其中左半部包含 n1 个点(编号 1n1),右半部包含 n2 个点(编号 1n2),二分图共包含 m 条边。

数据保证任意一条边的两个端点都不可能在同一部分中。

请你求出二分图的最大匹配数。

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

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

输入格式

第一行包含三个整数 n1n2m

接下来 m 行,每行包含两个整数 uv,表示左半部点集中的点 u 和右半部点集中的点 v 之间存在一条边。

输出格式

输出一个整数,表示二分图的最大匹配数。

数据范围

1n1,n2500,
1un1,
1vn2,
1m105

输入样例:

2 2 4 1 1 1 2 2 1 2 2

输出样例:

2
  • 时间复杂度:O(nm)

代码

#include<bits/stdc++.h> using namespace std; const int N=505; int n1,n2,m,match[N]; bool st[N]; vector<int> adj[N]; bool find(int x) { for(int y:adj[x]) { if(!st[y]) { st[y]=true; if(match[y]==0||find(match[y])) { match[y]=x; return true; } } } return false; } int main() { scanf("%d%d%d",&n1,&n2,&m); while(m--) { int x,y; scanf("%d%d",&x,&y); adj[x].push_back(y); } int res=0; for(int i=1;i<=n1;i++) { memset(st,false,sizeof st); if(find(i))res++; } printf("%d",res); return 0; }

__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/15609566.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(46)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示