【模板】二分图最大匹配
洛谷P3386
思路
使用匈牙利算法解决二分图最大匹配问题。
这道题就是匈牙利算法的模板题。
代码
#include<bits/stdc++.h>
#pragma G++ optimize(2)
#pragma G++ optimize("inline")
using namespace std;
int n,m,g,id,ans,h[505],match[505];
bool vis[505];
struct q{
int to,ne;
}e[50005];
namespace node{
inline void add(int a,int b){
e[++id]={b,h[a]};
h[a]=id;
}
// 深度优先搜索函数,用于寻找增广路径
inline bool dfs(int u){
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
// 如果该节点已经被访问过,则跳过
if(vis[v]){
continue;
}
vis[v]=true;
// 如果该节点没有匹配或者可以通过其匹配的节点找到增广路径
if(!match[v]||dfs(match[v])){
match[v]=u;
return true;
}
}
return false;
}
}
using namespace node;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>g;
for(int i=1,a,b;i<=g;i++){
cin>>a>>b;
add(a,b);
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
// 如果从左部点 i 出发可以找到增广路径
if(dfs(i)){
ans++;
}
}
cout<<ans;
return 0;
}