zoukankan      html  css  js  c++  java
  • 二分图匹配(匈牙利算法)

    POJ 1274:http://poj.org/problem?id=1274

    匈牙利算法我是看了一个代码后才明白的,原来看算法导论讲的云里雾里,搞不明白,还是代码实现能力太差。

    数据结构:

    int n, m, ans;                //n个待匹配点去匹配m个点
    int  link[Max];              //link[i]=x记录当前与i节点相连的节点x
    bool mat[Max][Max];         //  mat[i][j]表示奶牛i能否匹配圈j。
    bool vis[Max];             //  标记点是否被访问

    DFS搜索为点u寻找匹配点:

    bool dfs(int u)       
    {        //  表示现在在为u寻求匹配
        for(int i = 1; i <= m; i ++)
            if(!vis[i] && mat[u][i])
            {
                vis[i] = true;
                if(link[i] == -1 || dfs(link[i]))   
                {      //  条件:i还没匹配,或者link[i]找到新的匹配。
                    link[i] = u;
                    return true;
                }
            }
        return false;
    }

    初始化:

    初始化时要把link[]全部初始化为-1或0。
    
    并在每次对i点匹配时初始化一次vis[]数组,因为对i匹配j时无视j是否已被匹配,只要i和j匹配更好就成了。

    总体思路:

    1.初始化。

    link[]全部初始化为-1.mat[i][j]当i可以和j匹配时初始化为1,否则初始化为0.每次匹配i点时初始化vis[]=0。ans=0.

    2.对每个点i 搜索dfs,寻找更优的匹配。

    i和j可以匹配当且仅当j未被匹配或link[j]找到了新的匹配。

    找到后ans++

    3.输出ans

  • 相关阅读:
    jQuery --checkbox全选和取消全选简洁高效的解决办法
    扩展jquery插件的方法
    git
    varchar,char,varchar2,mybatis查询无返回
    Docker拉取mysql并连接
    Map
    mysql数据库用ip访问
    docker的安装和docket拉取Oracle
    springboot
    linux 安装mysql
  • 原文地址:https://www.cnblogs.com/liuyalunuli/p/2709710.html
Copyright © 2011-2022 走看看