KM算法模板
来源:互联网 发布:java实例代码 编辑:程序博客网 时间:2024/05/07 09:47
int g[maxn][maxn];int S[maxn],T[maxn];int lv[maxn],rv[maxn],leftp[maxn];int slack;int tot1,tot2;void update(){for(int i=1;i<=tot1;i++) { if(S[i]) lv[i]-=slack; if(T[i]) rv[i]+=slack; }}int match(int u){ S[u]=1; int i;for(i=1;i<=tot1;i++) { if(lv[u]+rv[i]==g[u][i]) { if(!T[i]) { T[i]=1; if(leftp[i]==-1||match(leftp[i])) { leftp[i]=u; return 1; } } } else slack=min(lv[u]+rv[i]-g[u][i],slack); } return 0;}int solve(){ int i,j;memset(leftp,-1,sizeof(leftp));for(i=1;i<=tot1;i++) { lv[i]=rv[i]=0;for(j=1;j<=tot1;j++) lv[i]=max(lv[i],g[i][j]); }for(i=1;i<=tot1;i++) { for(;;) {for(j=1;j<=tot1;j++) S[j]=T[j]=0; slack=inf; if(match(i)) break; else update(); } } int sum=0; for(i=1;i<=tot1;i++) sum=sum+lv[i]+rv[i]; return sum;}