P3386 【模板】二分图匹配
#include <bits/stdc++.h> using namespace std; const int maxn = 1010; int n,m,e; int vis[maxn][maxn]; int ask[maxn]; int cnt, ans; int matched[maxn]; bool fid(int x) { for (int i = 1 ; i <= m; i++) if (vis[x][i]) { if (ask[i]) continue; ask[i] = 1; if (!matched[i] || fid(matched[i])) { matched[i] = x ; return true; } } return false; } void match() { cnt = 0; memset(matched, 0, sizeof(matched)); for(int i = 1; i <= n; ++i) { memset(ask, 0, sizeof(ask)); if(fid(i)) { cnt++; } } ans = cnt; } int main() { scanf("%d %d %d",&n,&m,&e); cnt = 0; for(int i = 1; i <= e; i++) { int x,y; scanf("%d %d",&x, &y); vis[x][y] = 1; } match(); printf("%d\n",ans); return 0; }