标签:des style blog http java color os strong
6 9 1 2 5 2 3 5 3 1 10 3 4 12 4 1 8 4 6 11 5 4 7 5 6 9 6 5 4 6 5 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1
42 -1HintIn the first sample, there are two cycles, (1->2->3->1) and (6->5->4->6) whose length is 20 + 22 = 42.
这是1853代码,后一题建成双向边就行了,代码类似。
#include"stdio.h"
#include"string.h"
#define N 105
#define mmax(a,b) ((a)>(b)?(a):(b))
#define mmin(a,b) ((a)<(b)?(a):(b))
const int inf=(int)1e8;
int g[N][N],slack[N],n;
int link[N],lx[N],ly[N];
int visx[N],visy[N];
int find(int k)
{
    int i;
    visx[k]=1;
    for(i=1;i<=n;i++)
    {
        if(visy[i])
            continue;
        int d=lx[k]+ly[i]-g[k][i];
        if(d==0)
        {
            visy[i]=1;
            if(link[i]==-1||find(link[i]))
            {
                link[i]=k;
                return 1;
            }
        }
        else
            slack[i]=mmin(slack[i],d);
    }
    return 0;
}
int KM()
{
    int i,j;
    memset(ly,0,sizeof(ly));
    memset(link,-1,sizeof(link));
    for(i=1;i<=n;i++)
    {
        lx[i]=-inf;
        for(j=1;j<=n;j++)
        {
            lx[i]=mmax(lx[i],g[i][j]);
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            slack[j]=inf;
        }
        while(1)
        {
            memset(visx,0,sizeof(visx));
            memset(visy,0,sizeof(visy));
            if(find(i))
                break;
            else
            {
                int d=inf;
                for(j=1;j<=n;j++)
                {
                    if(!visy[j])
                        d=mmin(slack[j],d);
                }
                for(j=1;j<=n;j++)
                {
                    if(visx[j])
                        lx[j]-=d;
                    if(visy[j])
                        ly[j]+=d;
                }
            }
        }
    }
    int ans=0;
    for(i=1;i<=n;i++)
    {
        if(link[i]==-1||g[link[i]][i]==-inf)
            break;
        ans+=g[link[i]][i];
    }
    if(i<=n)
        return -1;
    return -ans;
}
int main()
{
    int i,j,u,v,w,m;
    while(scanf("%d%d",&n,&m)!=-1)
    {
        for(i=1;i<=n;i++)        //注意初始化边为最小值
        {
            for(j=1;j<=n;j++)
            {
                g[i][j]=-inf;
            }
        }
        while(m--)
        {
            scanf("%d%d%d",&u,&v,&w);
            g[u][v]=mmax(g[u][v],-w);
        }
        printf("%d\n",KM());
    }
    return 0;
}
hdu 1853 Cyclic Tour && hdu 3435 A new Graph Game(简单KM算法),布布扣,bubuko.com
hdu 1853 Cyclic Tour && hdu 3435 A new Graph Game(简单KM算法)
标签:des style blog http java color os strong
原文地址:http://blog.csdn.net/u011721440/article/details/38227039