二分圖最大匹配問題
阿新 • • 發佈:2020-12-06
洛谷P3386二分圖最大匹配 || 匈牙利演算法
給定一張二分圖,其左部點集大小為 n,右部點集大小為 m,共k條邊,請求出其最大匹配。
需要注意的是,在一輪遞迴中,每個右部點只能被訪問一次。
#include <bits/stdc++.h> using namespace std; const int maxn = 5e4 + 7; const int N = 555; typedef long long ll; int head[maxn], vis[N], match[N], cnt; struct edge { int to, next; }e[maxn];void add(int u, int v) { e[++cnt].next = head[u]; e[cnt].to = v; head[u] = cnt; } bool dfs(int x) { for(int i = head[x]; i; i = e[i].next) { int v = e[i].to; if(!vis[v]) { vis[v] = 1; //這裡就置為1,而不是在if裡再置,因為if若成功進入,表示可以將x和v匹配,所以必須要求在整個遞迴過程中v都不再被選擇if(!match[v] || dfs(match[v])) { match[v] = x; return 1; } } } return 0; } int main() { int n, m, k, x, y, ans = 0; scanf("%d %d %d", &n, &m, &k); for(int i = 1; i <= k; ++i) { scanf("%d %d", &x, &y); add(x, y); } for(int i = 1; i <= n; ++i) { memset(vis, 0, sizeof(vis)); ans += dfs(i); } cout << ans << endl; }