前言
匈牙利算法
可以解决的问题:
(原谅我的偷懒)
(原谅我的水文)
代码
#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
*/