hdu2063 过山车 二分图最大匹配 匈牙利算法

来源:互联网 发布:pkpm软件分几种 编辑:程序博客网 时间:2024/05/01 02:29

题解:利用dfs或者bfs不停找到增广路,然后用一个link[]数组记录匹配。如果link[i]没有在原匹配中,就更新匹配并加入其中,当此次增广路完成并更新完匹配,最大匹配值ans加1。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>#include<cmath>#include<cctype>#include<vector>using namespace std;int v1,v2,ans;int a[1001][1001];int vit[1001];int link[1001];bool dfs(int x){    for(int y=1;y<=v2;y++)    {        if(a[x][y]&&!vit[y])        {            vit[y]=1;            if(link[y]==0||dfs(link[y]))//link[y]==0: y不属于前一个匹配M。            {                link[y]=x;                return true;            }        }    }    return false;}void Search(){    for(int i=1;i<=v1;i++)    {        memset(vit,0,sizeof(vit));        if(dfs(i))            ans++;    }    return ;}int main(){    int k,m,n;    while(cin>>k)    {        if(k==0)            break;        cin>>n>>m;        v1=n,v2=m;        memset(a,0,sizeof(a));        memset(link,0,sizeof(link));        for(int i=1;i<=k;i++)        {            int x,y;            cin>>x>>y;            a[x][y]=1;        }        ans=0;        Search();        cout<<ans<<endl;    }    return 0;}