二分图的最大匹配

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);
}

 

posted on 2022-08-14 19:32  樵风  阅读(23)  评论(0)    收藏  举报