HDU 1385 Minimum Transport Cost(Floyd + 打印路径)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1385

 

题意:先给你一张你n * n的图,代表城市间的距离,然后,给出n个tax的费用,然后很多询问,问你a到b的最少费用。。。。并且打印路径(字典序)。。。

注意tax的费用起点和终点不算。。。。。

 

开始是算吧起点和终点的费用都算上,最后减掉,这样是不能得到最少费用的。。。。后来想到在三重for里+上tax的费用。。。。就觉得这题完全是为了深刻理解Floyd而出的

 

然后到打印路径,用path[i][j]表示i到j这条最短路中i的直接后驱然后不断的记录直接后驱。。。。最后就可以把路径都纪录了

 

还有一点是如果起点 == 终点的时候 正确路径只有 一个点 而不是 a -- > a

 

代码:

#include <iostream>

using namespace std;



const int M = 500;

const int INF = 1111111;



int g[M][M];

int path[M][M];

int tax[M];



int main()

{

    //printf("%d\n", INF);

    int n;

    while (~scanf("%d", &n), n)

    {

        for (int i = 1; i <= n; i++)

        {

            for (int j = 1; j <= n; j++)

            {

                scanf("%d", &g[i][j]);

                if (g[i][j] == -1)

                {

                    g[i][j] = INF;

                }

                path[i][j] = j;//初始化

            }



        }



        for (int i = 1; i <= n; i++)

        {

            scanf("%d", tax + i);

        }



        for (int k = 1; k <= n; k++)

        {

            for (int i = 1; i <= n; i++)

            {

                for(int j = 1; j <= n; j++)

                {

                    if (g[i][j] > g[i][k] + g[k][j] + tax[k])//加了个tax费用

                    {

                        g[i][j] = g[i][k] + g[k][j] + tax[k];

                        path[i][j] = path[i][k];

                    }

                    else

                    {

                        if (g[i][j] == g[i][k] + g[k][j] + tax[k] && path[i][j] > path[i][k])//当路径相等的时候按字典序选择

                        {

                            path[i][j] = path[i][k];

                        }

                    }

                }

            }

        }







        int a, b;

        while (scanf("%d%d", &a, &b), (a != -1 || b != -1))

        {

            printf("From %d to %d :\nPath: %d", a, b, a);

            

            int u = a, v = b;



            while (u != v)//起点等于终点的时候路径只有一个点

            {

                

                printf("-->%d", path[u][v]);

                u = path[u][v];

                

            }



            printf("\nTotal cost : %d\n\n", g[a][b]);

        }

    }

    return 0;

}

 

 

你可能感兴趣的:(floyd)