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