• 二分图最优匹配模板


    const int MAX = 1e6+10;
    const int inf = 0x3f3f3f3f;
    int n,m;
    int lx[MAX],ly[MAX];
    int match[MAX];
    int usex[MAX],usey[MAX];
    int w[MAX][MAX];
    int find(int u) {
        usex[u]=1;
        for(int i=0;i<m;i++) {
            if(!usey[i]&&w[u][i]==ly[i]+lx[u]) {
                usey[i]=1;
                if(match[i]==-1||find(match[i])) {
                    match[i]=u;
                    return true;
                }
            }
        }
        return false;
    }

    void update() {
        int d=inf;
        for(int i=0;i<n;i++) if(usex[i]) {
            for(int j=0;j<m;j++) if(!usey[j]) {
                d=min(d,usex[i]+usey[j]-w[i][j]);
            }
        }
        for(int i=0;i<n;i++) if(usex[i]) lx[i]-=d;
        for(int i=0;i<m;i++) if(usey[i]) ly[i]+=d;

    }
    int kuhn () {
        memset(match,-1,sizeof(match));
        for(int i=0;i<n;i++) {
            lx[i]=ly[i]=0;
            for(int j=0;j<m;j++) {
                lx[i]=max(lx[i],w[i][j]);
            }
        }
        for(int i=0;i<n;i++) {
            while(true) {
                memset(usex,0,sizeof(usex));
                memset(usey,0,sizeof(usey));
                if(find(i)) break;
                update();
            }
        }
    }
    我手敲的啊,正确性待验。
  • 相关阅读:
    Spring-cloud微服务实战【三】:eureka注册中心(中)
    Spring-cloud微服务实战【二】:eureka注册中心(上)
    Spring-cloud微服务实战【一】:微服务的概念与演进过程
    数据压缩算法
    求最大连续子集
    天天看底层有什么用
    数字签名
    计算机全加器简单实现
    布隆过滤器
    纠错码简介
  • 原文地址:https://www.cnblogs.com/acvc/p/3812645.html
Copyright © 2020-2023  润新知