二分图最大匹配(匈牙利算法)

注意每次搜索时一定要清空上次搜索标记
每次二分图匹配是只从一边开始搜索,另一边在 m a t c h match 时已经走过了
且不能连双向边

#include <bits/stdc++.h>
using namespace std;
const int N=1000050;
int n,m,e;
int fir[N],to[N<<1],tot,w[N<<1],nxt[N<<1]; 
inline int read(){
	int cnt=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)){cnt=(cnt<<3)+(cnt<<1)+(c^48);c=getchar();}
	return cnt*f;
}
void add(int x,int y){nxt[++tot]=fir[x];fir[x]=tot;to[tot]=y;}
bool vis[N];
int match[N];
bool dfs(int x){
	for(int i=fir[x];i;i=nxt[i]){
		int y=to[i];
		if(vis[y])continue;
		vis[y]=1;
		if(!match[y]||dfs(match[y])){
			match[y]=x;
			return true;
		}
	}	
	return false;
}
int main(){
	n=read(),m=read(),e=read();
	int u,v;
	for(int i=1;i<=e;i++){
		u=read(),v=read();
		if(v>m||u>n)continue;
		add(u,v);
	}
	int ans=0;
	for(int i=1;i<=n;++i){
		memset(vis,0,sizeof(vis));
		if(dfs(i))ans++;
	}
	printf("%d",ans);
	return 0;
}
发布了37 篇原创文章 · 获赞 11 · 访问量 1921

猜你喜欢

转载自blog.csdn.net/weixin_42750325/article/details/103091625
今日推荐