模板:最大匹配

文章目录

前言

匈牙利算法
可以解决的问题:
在这里插入图片描述
(原谅我的偷懒)
(原谅我的水文)

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+100;
const int mod=1e9+7;
int n,m,e;
struct node{
	int to,nxt;
}p[N<<1];
int fi[N],cnt=-1;
void addline(int x,int y){
	p[++cnt]=(node){y,fi[x]};
	fi[x]=cnt;
}
int mch[N];
int vis[N];
bool dfs(int x,int tim){
	if(vis[x]==tim) return false;
//	printf("  dfs:%d\n",x);
	vis[x]=tim;
	for(int i=fi[x];~i;i=p[i].nxt){
		int to=p[i].to;
		if(!mch[to]||dfs(mch[to],tim)){
			mch[x]=to;mch[to]=x;return true;
		}
	}
	return false;
}
int main(){
	memset(fi,-1,sizeof(fi));
	scanf("%d%d%d",&n,&m,&e);
	for(int i=1;i<=e;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		addline(x,y+n);addline(y+n,x);
	}
	int res=0;
	for(int i=1;i<=n;i++){
//		printf("i=%d\n",i);
		if(dfs(i,i)) res++;
//		printf("res=%d\n",res);
	}
	printf("%d\n",res);
	return 0;
}
/*
3
5
1 1 1 0 1
1 1 1 1 1
1 1 1 0 1
1 1 1 1 0
1 1 1 1 1
3
1 0 0
0 1 0
0 0 1
6
1 1 1 1 0 1
1 1 1 1 0 1
1 1 1 1 0 1
1 1 1 1 1 1
0 0 0 1 1 1
1 1 1 1 1 1
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值