zoukankan      html  css  js  c++  java
  • 匈牙利算法

    匈牙利算法的原理很简单,就是:( m{color{red}{随便找个位置,如果位置上被匹配了,让该位置的占有者去找另一个位置,该位置的占有者找不到才占回原来的位置}})
    还是举个例子,会容易理解些:
    现在有五个人A、B、C、D、E和四个座位,每个人都想找个座位休息,但每个人都很挑剔,只喜欢某个桌位。
    这里写图片描述
    A只想坐1、3号位,B只想坐1、2号位,C只想坐1、3号位,D只想坐3号位,E只想坐4号位。
    他们按照循序选择座位
    首先A选择了1号位,
    这里写图片描述
    接着B想选择1号位,但被A坐了。于是B让A去找一个新的座位,A选择了3号位。A找到了新座位,所以B选择了1号位。
    这里写图片描述
    到了C,C想选择1号位,但被B坐了。于是C让B去找一个新的座位,B选择了2号位。B找到了新座位,所以C选择了1号位。
    这里写图片描述
    轮到D,D想选择1号位,但被A坐了。于是D让A去找一个新的座位,A想选择了1号位,但被C坐了。于是A让C去找一个新的座位,C只能去找3号位了,但3号位又被D坐了,D也没别的位坐了。C找到了A,让他把座位还回来。A再去找D,让他把座位还回来。最后,D没找到座位。
    这里写图片描述
    接着口味独特的E选择了4号位。
    这里写图片描述
    可怜的D。
    原理大概就是这样了。

    //xyl[j]表示第j个位置被谁占有。
    //used[j]表示第j个位置是否被查看过,如果被查看过,显然就不再去查看了(在每一次进行匈牙利时,把used赋值为true)。
    bool find(int x)
    {
        int i,j,k,l;
        for(i=last[x];i;i=next[i])
        {
            j=to[i];
            if(used[j])
            {
                used[j]=false;
                if(xyl[j]==0 || find(xyl[j]))
                {
                    xyl[j]=x;
                    return true;
                }
            }
        }
        return false;
    }
    
  • 相关阅读:
    IIS和tomcat共用80端口
    CYQ.Data V5 从入门到放弃ORM系列:教程
    C#中==与Equals方法的区别
    一个简单得不能再简单的“ORM”了
    msbuild ConfuserEx.Build 加密
    C#生成注册码
    从多个XML文档中读取数据用于显示webapi帮助文档
    ASP.NET MVC SSO 单点登录设计与实现
    ASP.NET MVC Bootstrap极速开发框架
    Nodejs初阶之express
  • 原文地址:https://www.cnblogs.com/chen1352/p/9029699.html
Copyright © 2011-2022 走看看