【模板】二分图最大匹配

洛谷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;
}
posted @ 2024-12-13 21:30  yzbyzb  阅读(11)  评论(0编辑  收藏  举报
//雪花飘落效果