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;}


原创粉丝点击