1. 程式人生 > 實用技巧 >二分圖最大匹配問題

二分圖最大匹配問題

洛谷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; }