zoukankan      html  css  js  c++  java
  • 最大匹配 && 最佳完美匹配 模板

    1.最佳完美匹配------km算法

    bool match(int u){
        s[u]=true;
        for(int v=1; v<=n; v++){
            if(t[v]) continue;
            int d=lx[u]+ly[v]-w[u][v];
            if(!d){
                t[v]=true;
                if(lft[v]==-1 || match(lft[v])){
                    lft[v]=u;
                    return true;
                }
            }
            else slack[v]=MIN(slack[v], d);
        }
        return false;
    }
    
    int km(){
        int i, j;
        fill(lft+1, lft+1+n, -1);
        fill(ly+1, ly+1+n, 0);
        for(i=1; i<=n; i++)
            for(j=1, lx[i]=-INF; j<=n; j++)
                lx[i]=MAX(lx[i], w[i][j]);
        for(i=1; i<=n; i++){
            fill(slack+1, slack+1+n, INF);
            while(true){
                fill(s+1, s+1+n, 0);
                fill(t+1, t+1+n, 0);
                if(match(i)) break;
                int d=INF;
                for(j=1; j<=n; j++) if(!t[j])
                    d=MIN(d, slack[j]);
                for(j=1; j<=n; j++){
                    if(s[j]) lx[j]-=d;
                    if(t[j]) ly[j]+=d;
    //                else slack[j]-=d;
                }
            }
        }
    
        int ans=0;
        for(i=1; i<=n; i++)
            ans+=w[lft[i]][i];
        return ans;
    }
    

     2.最大匹配------匈牙利算法 (Hungary Algorithm  by Edmonds)

    bool match(int u){                              //最大匹配
        for(int i=0; i<g[u].size(); i++){
            int v = g[u][i];
            if(vis[v]) continue;        vis[v]=true;
            if(lft[v]==-1 || match(lft[v])){
                lft[v]=u;
                return true;
            }
        }
        return false;
    }
    
    int solve(){
        int ans=0;
        fill_n(lft+1, v, -1);
        for(i=0; i<votedog.size(); i++){
            fill_n(vis+1, v, false);
            if(match(votedog[i])) ans++;
        }
        return v-ans;
    }
    
  • 相关阅读:
    41. 缺失的第一个正数
    40. 组合总和 II
    39. 组合总和
    38. 外观数列
    35. 搜索插入位置
    设计模式(1)单例模式
    一篇文章彻底搞懂Java的大Class到底是什么
    Vue实现一个MarkDown编辑器
    7 二分搜索树的原理与Java源码实现
    6 手写Java LinkedHashMap 核心源码
  • 原文地址:https://www.cnblogs.com/ramanujan/p/3364230.html
Copyright © 2011-2022 走看看