C语言 [二分图最大匹配] 匈牙利算法!

代码实现:

constintINF = 0x3f3f3f3f;

constintMAXN=510;

intuN,vN;//u,v数目

intg[MAXN][MAXN];//构图

intlink[MAXN];   //link[v]=u表示右边对左边的匹配

boolused[MAXN];//是否访问过

booldfs(intu)//从左边开始找增广路径

{

    intv;

    for(v=0;v<vN;v++)//右边顶点编号从0开始

    {

        if(g[u][v]&&!used[v])  //如果存在通路,且从u开始搜索时该点没访问过

        {

            used[v]=true;

            if(link[v]==-1 || dfs(link[v])) //找增广路

            {

                link[v]=u;

                returntrue;

            }

        }

    }

    returnfalse;

}

inthungary()

{

    intres=0;

    inti,u;

    memset(link,-1,sizeof(link));

    for(u=0;u<uN;u++)

    {

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

        if(dfs(u))

            res++;

    }

    returnres;

} 

--------------------------------------

以上是匈牙利算法的关键代码 

其实实现就是一个找增广路径的过程 

增广路径 字面意思就是把路径越增越广 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值