二分图的最大匹配
P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- 匈牙利算法
- 遍历所有的左部点
- 如果左部点可以找到右部没匹配过的或者右部过了但是原配(左部)可以找到其他的右部点去匹配,那么当前遍历到的左部点是可以匹配的,匹配的点就是可以找到的右部点
- 否则就不可
- match[i]=j代表i(右部)的匹配点是j,dfs返回值代表能否成功匹配,vis和flag组合用于标记之前dfs过了(指在同一个外部dfs下访问过了,因为外层dfs的标记会变化)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 10000001
// https://www.luogu.com.cn/problem/P3386
vector<int> G[MAX];
int match[MAX], vis[MAX];
bool dfs(int u, int flag)
{
if (vis[u] == flag)
return false;
vis[u] = flag;
for (int v : G[u])
if (!match[v] || dfs(match[v], flag))
{
match[v] = u;
return true;
}
return false;
}
int n, m, t, a, b, ans;
int main()
{
cin >> n >> m >> t;
for (int i = 1; i <= t; i++)
{
scanf("%d%d", &a, &b);
G[a].push_back(b);
}
for (int i = 1; i <= n; i++)
{
if (dfs(i, i))
ans++;
}
printf("%d", ans);
}
浙公网安备 33010602011771号