zoukankan      html  css  js  c++  java
  • 匈牙利算法自主总结

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

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

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

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

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

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

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

    很显然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

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

  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/xmex/p/10165924.html
Copyright © 2011-2022 走看看