#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define RG register
#define IL inline
#define pi acos(-1.0)
#define ll long long
using namespace std;
const int maxn = 210;
int n,m,x,y,ans=0;
int a[maxn],b[maxn];//a:匹配点连向的被匹配点,b:被匹配点连向的匹配点
bool vis[maxn],g[maxn][maxn];
bool dfs(int u) {
for(int i=1; i<=m; i++)
if(g[u][i] && !vis[i]) {
vis[i]=1;
if(dfs(b[i]) || b[i]==-1) {
b[i]=u,a[u]=i;
return true;
}
}
return false;
}
int main() {
scanf("%d%d", &n, &m);
while(scanf("%d%d", &x, &y)!=EOF) g[x][y]=1;
memset(a,-1,sizeof(a));
memset(b,-1,sizeof(b));
for(int i=1; i<=n; i++) {
if(a[i]==-1) {
memset(vis,0,sizeof(vis));//增广路上的点只能匹配一次
if(dfs(i)) ans++;
}
}
printf("%d", ans);
return 0;
}
匈牙利算法
最新推荐文章于 2022-04-06 01:53:35 发布