二分图最优匹配模板

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();
        }
    }
}
我手敲的啊,正确性待验。
原文地址:https://www.cnblogs.com/acvc/p/3812645.html