pku1734 Sightseeing trip(求无向图的最小环)

和hdu1599 find the mincost route 差不多
#include <stdio.h>

 

#define MAXN 105
#define INF 999999

int idx,ans,N,M,g[MAXN][MAXN],dist[MAXN][MAXN],post[MAXN][MAXN],path[MAXN];

void init()
{
    int i,j,len;
    ans=INF;
    for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
        {
            dist[i][j]=g[i][j]=INF;
            post[i][j]=j;
        }
    while(M--)
    {
        scanf("%d %d %d",&i,&j,&len);
        if(g[i][j] > len)
        {
            g[j][i]=g[i][j]=len;
            dist[i][j]=dist[j][i]=g[i][j];
        }
    }
}

void floyd()
{
    int i,j,k;
    for(k=1; k<=N; k++)
    {
        for(i=1; i<k; i++)
        {
            for(j=1; j<i; j++)
            {
                if(ans > g[i][k]+g[k][j]+dist[i][j])
                {
                    ans = g[i][k]+g[k][j]+dist[i][j];
                    idx=0;
                    int t=i;
                    path[idx++]=t;
                    while(post[t][j]!=j)
                    {
                        path[idx++]=post[t][j];
                        t=post[t][j];
                    }
                    path[idx++]=j;
                    path[idx++]=k;
                }
            }
        }
        for(i=1; i<=N; i++)
        {
            for(j=1; j<=N; j++)
            {
                if(dist[i][j] > dist[i][k] + dist[k][j])
                {
                    dist[i][j] = dist[i][k] + dist[k][j] ;
                    post[i][j]=post[i][k];
                }
            }
        }
    }
}

int main()
{
    while(scanf("%d %d",&N,&M)!=EOF)
    {
        init();
        floyd();
        if(ans==INF) printf("No solution.\n");
        else
        {
            for(int i=0; i<idx; i++)
            {
                if(!i) printf("%d",path[i]);
                else printf(" %d",path[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

posted @ 2010-09-02 01:38  菜到不得鸟  阅读(244)  评论(0编辑  收藏  举报