zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    php 字符串查找
    php缓存与加速分析与汇总
    oracle 时间问题
    mysql数据迁移
    浅谈千万级PV/IP规模高性能高并发网站架构
    对memcache分布式的一点理解
    美国程序员将工作廉价外包给中国公司遭解雇
    16个Linux服务器监控命令
    在yii中使用memcache
    Windows电脑快捷健大全
  • 原文地址:https://www.cnblogs.com/qiufeihai/p/2672015.html
Copyright © 2011-2022 走看看