• 最大匹配 && 最佳完美匹配 模板


    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;
    }
    
  • 相关阅读:
    BZOJ3744 : Gty的妹子序列
    BZOJ2827 : 千山鸟飞绝
    BZOJ3547 : [ONTAK2010]Matchings
    BZOJ1185 : [HNOI2007]最小矩形覆盖
    BZOJ3046 : lagoon
    BZOJ3743 : [Coci2014]Kamp
    BZOJ3742 : Painting
    iOS移动开发周报-第25期
    适合码农工作时玩的游戏:Scrum
    iOS移动开发周报-第24期
  • 原文地址:https://www.cnblogs.com/ramanujan/p/3364230.html
Copyright © 2020-2023  润新知