hdu2063(二分图最大匹配)

来源:互联网 发布:windows whistler2296 编辑:程序博客网 时间:2024/06/05 20:36


匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。它是一种用增广路径求二分图最大匹配的算法。


贴网站


http://blog.csdn.net/dark_scope/article/details/8880547


加一些自己的理解


对于这个dfs,比较难理解的是used

int dfs(int u)

{

    for(int v=1;v<=m;v++)

    {

        if(ch[u][v]==1&&!used[v])

        {

            used[v]=1;

            if(link[v]==0||dfs(link[v]))

            {

                link[v]=u;

                return1;

            }

        }

    }

    return0;

}

used的作用是用来记录虚线,就是图中的黄线


这表示在递归的过程中这个男生不能配对因为他正在配对待机中,(题目和图片的男生女生是反着的)

同时used!=0也代表了在这次查询中这个男生已经没希望了

下次配对used清零




#include <iostream>

#include <stdio.h>

#include <string.h>

using namespacestd;

int n,m,ch[1005][1005],used[1005],link[1005];

int dfs(int u)

{

    for(int v=1;v<=m;v++)

    {

        if(ch[u][v]==1&&!used[v])

        {

            used[v]=1;

            if(link[v]==0||dfs(link[v]))

            {

                link[v]=u;

                return1;

            }

        }

    }

    return0;

}

int main()

{

    int k,x,y,ans;

    while(~scanf("%d",&k)&&k!=0)

    {

        ans=0;

        scanf("%d %d",&n,&m);

        for(int i=1;i<=n;i++)

            for(int j=1;j<=m;j++)

                ch[i][j]=0;

        while(k--)

        {

            scanf("%d %d",&x,&y);

            ch[x][y]=1;

        }

        memset(link,0,sizeof(link));

        for(int i=1;i<=n;i++)

        {

            memset(used,0,sizeof(used));

            if(dfs(i)==1)

                ans++;

        }

        printf("%d\n",ans);

    }

    return0;

}