码迷,mamicode.com
首页 > 编程语言 > 详细

匈牙利算法自主总结

时间:2018-12-23 23:56:39      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:分享图片   sed   show   了解   int   ||   ora   href   https   

看原理之前我们先来了解——匈牙利概念

在我们理解概念之后,我们知道这是一个优化时间的算法

至于原理是什么我们现在来讲(以下图片由一只秀逗提供)

首先我们先来放一张男女找伴侣的图

技术分享图片

是不是有种鲜花插在牛粪上的感脚

我们看他们相互的连线,所连的线表示男生对某个女生有好感

那么我们男生按编号从小到大来找对象

很显然1——>1      2——>2,但是到3号的时候发现跟一号是情敌

那怎么办呢?我们假设三号抢的过一号那么一号女生让给了三号

还好一号还喜欢二号女生,那么我们把二号女生给一号

但是之前二号男生喜欢二号女生,那么只能受委屈

喜欢另一个目标——三号女生

这样前三位男生就不再冲突了

技术分享图片

就是这种情况(蓝线表示两两相对关系)

那么,我们只能恭喜四号男生找到了最漂亮的女生

其实这种找对象方法是一个递归的过程

那么匈牙利算法就是这种原理——有条件就上,没条件就创造条件上

那么我们来看匈牙利算法的板子

bool find(int x){
    int i,j;
    for (j=1;j<=m;j++){    //扫描每个妹子
        if (line[x][j]==true && used[j]==false)      
        //如果有暧昧并且还没有标记过(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了)
        {
            used[j]=1;
            if (girl[j]==0 || find(girl[j])) { 
                //名花无主或者能腾出个位置来,这里使用递归
                girl[j]=x;
                return true;
            }
        }
    }
    return false;
}

主程序是这样的

for (i=1;i<=n;i++)
{
    memset(used,0,sizeof(used));    //这个在每一步中清空
    if find(i) all+=1;
}

我们现在就可以做题啦

推荐一道水题——luogu P2071

再次感谢一只秀逗提供思路

匈牙利算法自主总结

标签:分享图片   sed   show   了解   int   ||   ora   href   https   

原文地址:https://www.cnblogs.com/xmex/p/10165924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!