zoukankan      html  css  js  c++  java
  • 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;
    
    } 

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

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

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

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

    实际意思也是一样的 

    DFS从左边起始点开始搜索 

            1.右边如果没匹配就匹配(link[v]==-1) 

            2.如果右边匹配过了...就从右边点找左边的匹配点再搜索看是否能增广 

    以上两种情况都能使匹配边+1 

    这就是找二分图最大匹配的最简单算法了,代码很短,时间复杂度为O(n^3),网络流当然也能实现咯... 

    记住咯: 

    最小点覆盖 = 二分图最大匹配 

    最小路径覆盖 = |P| - 二分图最大匹配


     

    不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~

    【值得关注】我的 编程学习交流俱乐部 !【点击进入】

    C语言入门资料:


     

    C语言必读书籍:


     
  • 相关阅读:
    多线程2
    多线程1
    Mybatis动态代理开发
    Mybatis的mapper.xml文件也是要加文件头的
    ssm框架只使用mybatis配置sqlmapconfig.xml
    ssm整合之web.xml配置
    SpringMVC三大组件的配置
    spring开启注解配置
    如何开发 Sublime Text 2 的插件
    ASP.NET MVC 5改进了基于过滤器的身份验证
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14831376.html
Copyright © 2011-2022 走看看