hdu 2064(二分图最大匹配)

  匈牙利算法求二分图最大匹配

  

#include<bits/stdc++.h>
using namespace std;
int line[505][505],used[505],nxt[505];
int k,m,n;
bool ifind(int x)
{
    for(int i=1;i<=n;i++)//给x男生找妹子,依次访问所有妹子
    {
        if(line[x][i]&&!used[i])//如果互相喜欢而且没被标记,used[i]==1,则i妹子已经名花有主
        {
            used[i]=1;
            if(nxt[i]==0||ifind(nxt[i]))//i妹子无喜欢人或i妹子喜欢的人可以喜欢其他人(相当于给x男生腾个位子)
            {
                nxt[i]=x;
                return true;
            }
        }
    }
    return false;
}
int match()
{
    int ans=0;
    for(int i=1;i<=m;i++)//给m给男生找妹子
    {
        memset(used,0,sizeof(used));
        if(ifind(i))
            ans++;
    }
        
    return ans;

}
int main()
{
    std::ios::sync_with_stdio(false);
    while(cin>>k&&k)
    {
        cin>>m>>n;
        memset(line,0,sizeof(line));
        memset(used,0,sizeof(used));
        memset(nxt,0,sizeof(nxt));
        for(int i=1;i<=k;i++)
        {
            int a,b;
            cin>>a>>b;
            line[a][b]=1;
        }
        cout<<match()<<endl;


    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/81262533