hdu 1385 Minimum Transport Cost(输出字典序最短路径)

#include <stdio.h>

#define MAXN 100

int N,g[MAXN][MAXN],tax[MAXN],post[MAXN][MAXN];

void init()
{
    int i,j;
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N;j++)
        {
            scanf("%d",&g[i][j]);
            post[i][j]=j;
        }
    }
    for(i=1;i<=N;i++) scanf("%d",&tax[i]);
}

void floyd()
{
    int i,j,k;
    for(k=1; k<=N; k++)
    {
        for(i=1;i<=N;i++)
        {
            if( i == k || g[i][k]==-1 ) continue;
            for(j=1;j<=N;j++)
            {
                if( k == j || i == j || g[k][j] == -1 ) continue;
                int t = g[i][k] + g[k][j] + tax[k];
                if(g[i][j] == -1 || g[i][j] > t)
                {
                    g[i][j] = t;
                    post[i][j] = post[i][k];
                }
                else if(g[i][j]==t && post[i][k]<post[i][j])
                {
                    post[i][j]=post[i][k];
                }
            }
        }
    }
}

void print(int x,int y)
{
    printf("Path: %d",x);
    while(post[x][y]!=y)
    {
        printf("-->%d",post[x][y]);
        x=post[x][y];
    }
    printf("-->%d\n",y);
}

int main()
{
    while(scanf("%d",&N),N)
    {
        init();
        floyd();
        int i,j;
        while(scanf("%d %d",&i,&j),(i!=-1 && j!=-1))
        {
            printf("From %d to %d :\n",i,j);
            if(i==j) printf("Path: %d\n",i);
            else print(i,j);
            printf("Total cost : %d\n\n",g[i][j]);
        }
    }
    return 0;
}

posted @ 2010-08-31 21:09  菜到不得鸟  阅读(312)  评论(0)    收藏  举报