P3386 【模板】二分图最大匹配

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 10,inf = 0x3f3f3f3f;
vector<int> g[N];
int R[N];
int vis[N];
int n,m,e;
int dfs(int x)
{
    for(int i = 0; i < g[x].size(); i++) //遍历左部x可以链接的每一个右部y 
    {
        int y = g[x][i];
        if(vis[y] == 0){ //左部x尝试和右部y匹配 
            vis[y] = 1;
            if(R[y] == 0 || dfs(R[y])){ 
            //=0说明y之前没有和其他左部匹配,那么匹配成功 
            //!=0说明y和其他左部匹配了,那么看看左部R[y]能不能修改匹配
            //值得注意的是此时是vis[y]=1,所以左部R[y]修改匹配时不会再和当前的y重新匹配 
                R[y] = x; //dfs(R[y])看着像左部x把本来属于左部R[y]的y抢走了... 
                return 1; //找到了x的匹配边 
            }
        }
    }
    return 0;//找不到 
}
int main()
{
    cin >> n >> m >> e;
    for(int i = 1; i <= e; i++)
    {
        int x,y; cin >> x >> y;
        g[x].push_back(y); //左部x和右部y链接 
    }
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i)) ans++; //第i个点可以提供匹配边 
    }
    cout << ans;
    return 0;
}

 

posted @ 2026-03-14 19:57  CRt0729  阅读(12)  评论(0)    收藏  举报