二分图的最大匹配
概念
二分图的最大匹配:两个集合中的点没有公共顶点
交错路:从非匹配点开始,由匹配边和非匹配边交替组成
增广路:从非匹配点开始,以非匹配点结束的交错路
匈牙利
匈牙利算法的基本思想是找增广路,可以分为一下几个步骤
- 遍历与现在节点相邻的边,找到另一个集合的顶点
- 假设将图中的路是否为增广路进行反转,这样只需要遍历的点没经过遍历就可以加入
- 如果遍历到的点已经被选中,则看看能否将它与其他点进行匹配
bool dfs(int x){
for(auto now:e[x]){
if(vis[now]){//在此轮中已经遍历过了
continue;
}
vis[now]=1;
if(!match[now] || dfs(match[now])){
match[now]=x;
return true;
}
}
return false;
}
这是部分,
#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
const int N=50010;
vector<vector<int>> e(N);
bool vis[N];
int match[N];
bool dfs(int x){
for(auto now:e[x]){
if(vis[now]){
continue;
}
vis[now]=1;
if(!match[now] || dfs(match[now])){
match[now]=x;
return true;
}
}
return false;
}
int main(){
int n,m,t;
cin>>n>>m>>t;
for(int i=0; i<t; i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
}
int sum=0;
for(int i=1; i<=n; i++){
memset(vis,0,sizeof(vis));//match没有清空
if(dfs(i)){
sum++;
}
}
cout<<sum<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】