时间复杂度:O(N^4)
本算法局限性较大,只能在满足“带权最大匹配一定是完备匹配”的图中正确求解,所以一般使用费用流来求解此类问题,但是本算法在求解稠密图时效率要高于费用流

const int N=105;
int w[N][N];
int la[N],lb[N];
bool va[N],vb[N];
int match[N];
int n,delta,upd[N];
bool dfs(int x){
    va[x]=1;
    for(int y=1;y<=n;y++)
        if(!vb[y])
            if(la[x]+lb[y]-w[x][y]==0){
                vb[y]=1;
                if(!match[y]||dfs(match[y])){
                    match[y]=x;
                    return true;
                }
            }
            else upd[y]=min(upd[y],la[x]+lb[y]-w[x][y]);
    return false;
}
int KM(){
    for(int i=1;i<=n;i++){
        la[i]=-(1<<30);
        lb[i]=0;
        for(int j=1;j<=n;j++)
            la[i]=max(la[i],w[i][j]);
    }
    for(int i=1;i<=n;i++)
        while(true){
            memset(va,0,sizeof va);
            memset(vb,0,sizeof vb);
            for(int j=1;j<=n;j++)    upd[j]=1e10;
            if(dfs(i))    break;
            for(int j=1;j<=n;j++)
                if(!vb[j])    delta=min(delta,upd[j]);
            for(int j=1;j<=n;j++){
                if(va[j])    la[j]-=delta;
                if(vb[j])    lb[j]+=delta;
            }
            int ans=0;
            for(int i=1;i<=n;i++)    ans+=w[match[i]][i];
            return ans;
        }
}