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

 

 

posted on 2012-09-05 15:26  [S*I]SImMon_WCG______*  阅读(799)  评论(0编辑  收藏  举报

导航