时间复杂度: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;
}
} 
京公网安备 11010502036488号