二分图最大匹配 匈牙利算法
二分图NTR算法,据悉是通过寻找增广路不断拓宽匹配的可能性,以至于找到二分图的最大匹配。
额,时间复杂度较高,O(nm)。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <stack>
#include <bitset>
#include <set>
#include <map>
#define int long long
#define IOS \
ios::sync_with_stdio(0); \
cin.tie(0); \
cout.tie(0);
#define ss second
#define ff first
#define ls u << 1
#define rs u << 1 | 1
using namespace std;
typedef pair<int, int> pii;
const int N = 1e6 + 10;
// 二分图最大匹配
// 通过不停的找增广路来寻找匹配边
int n, m, k, a, b;
int ans;
int h[N], idx;
int match[N];
bool vis[N];
struct node
{
int v, ne;
} e[N];
void add(int a, int b)
{
e[++idx] = {b, h[a]};
h[a] = idx;
}
bool dfs(int u)
{
for (int i = h[u]; i; i = e[i].ne)
{
int v = e[i].v;
if (vis[v])
continue;
vis[v] = 1;
if (!match[v] || dfs(match[v]))
{
match[v] = u;
return 1;
}
}
return 0;
}
signed main()
{
cin >> n >> m >> k;
for (int i = 0; i < k; i++)
{
cin >> a >> b;
add(a, b);
}
for (int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof vis);
if (dfs(i))
ans++;
}
cout << ans << endl;
return 0;
}