二分图匹配 匈牙利算法 C++

https://www.luogu.org/problemnew/show/P1894

#include<bits/stdc++.h>
#define maxn 200
using namespace std;
inline int read()
{
    int x=0;
    char c;
    c=getchar();
    while(!isdigit(c))
        c=getchar();
    while(isdigit(c))
    {
        x=(x<<3)+(x<<1)+(c-48);
        c=getchar(); 
    }
    return x;
}
vector<int>path[maxn+1]; 
int vis[maxn+1];
int res[maxn+1];
int find(int now)
{
    //vis[now]=1;
    for(int i=0;i<path[now].size();i++)
    {
        int next=path[now][i];
        if(!vis[next])
        {
            vis[next]=1;
            if(res[next]==0||find(res[next]))
            {
                res[next]=now;
                return 1;
            }
        }
    }
    return 0;    
} 
int main()
{
    int n;
    int m;
    n=read();
    m=read();
    for(int i=1;i<=n;i++)
    {
        int num;
        num=read();
        for(int j=1;j<=num;j++)
        {
            int p;
            p=read();
            path[i].push_back(p);
        } 
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(find(i))ans++;
    }
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/hlxcbd/p/9459345.html