hdu 1385 Minimum Transport Cost (Floyd + 字典序打印路径)

Minimum Transport Cost

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 7822    Accepted Submission(s): 2028

Problem Description

These are N cities in Spring country. Between each pair of cities there may be one transportation track or none. Now there is some cargo that should be delivered from one city to another. The transportation fee consists of two parts:

The cost of the transportation on the path between these cities, and

a certain tax which will be charged whenever any cargo passing through one city, except for the source and the destination cities.

You must write a program to find the route which has the minimum cost.

Input

First is N, number of cities. N = 0 indicates the end of input.

The data of path cost, city tax, source and destination cities are given in the input, which is of the form:

a11 a12 ... a1N

a21 a22 ... a2N

...............

aN1 aN2 ... aNN

b1 b2 ... bN

c d

e f

...

g h

where aij is the transport cost from city i to city j, aij = -1 indicates there is no direct path between city i and city j. bi represents the tax of passing through city i. And the cargo is to be delivered from city c to city d, city e to city f, ..., and
g = h = -1. You must output the sequence of cities passed by and the total cost which is of the form:

Output

From c to d :

Path: c-->c1-->......-->ck-->d

Total cost : ......

......

From e to f :

Path: e-->e1-->..........-->ek-->f

Total cost : ......

Note: if there are more minimal paths, output the lexically smallest one. Print a blank line after each test case.

Sample Input

5
0 3 22 -1 4
3 0 5 -1 -1
22 5 0 9 20
-1 -1 9 0 4
4 -1 20 4 0
5 17 8 3 1
1 3
3 5
2 4
-1 -1
0

Sample Output

From 1 to 3 :
Path: 1-->5-->4-->3
Total cost : 21

From 3 to 5 :
Path: 3-->4-->5
Total cost : 16

From 2 to 4 :
Path: 2-->1-->5-->4
Total cost : 17

Source

Asia 1996, Shanghai (Mainland China)

题意:n座城市,出租车经过编号为i城市要交的费用是cost[i],给出n*n的邻接矩阵,求多对从s到e的最小花费,并按字典序打印路径。

解析:由于有多对起始点,所以用Floyd算法。但是要稍微处理一下,每次松弛操作的判断条件要改一下,因为总费用要加上出租车经过城市的费用。对于记录字典序最小路径,也是在Floyd里面判断两路径相同时,取字典序小的地点。注意path[i][j]里面保存的是i到j路径上的经过的第一个点,输出的时候,只需要一直回溯输出即可。详见代码

AC代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define INF 1e7 + 2

int n, m;
int d[202][202], v[202];
int cost[202];
int path[202][202];

void floyd(){
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++) path[i][j] = j;
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++){
                int temp = d[i][k] + d[k][j] + cost[k];     //加上cost[k]
                if(d[i][j] > temp){
                    d[i][j] = temp;
                    path[i][j] = path[i][k];
                }
                else if(d[i][j] == temp){
                    if(path[i][j] > path[i][k])     //取字典序小的
                        path[i][j] = path[i][k];
                }
            }
}

void print(int s, int e){              //打印路径
    printf("%d", s);
    while(e != s){
        printf("-->%d", path[s][e]);
        s = path[s][e];
    }
    puts("");
}

int main(){
    #ifdef sxk
        freopen("in.txt", "r", stdin);
    #endif //sxk

    int x, y, z, s , t;
    while(scanf("%d", &n)!=EOF && n){
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++){
                scanf("%d", &d[i][j]);
                if(d[i][j] == -1) d[i][j] = INF;
            }
        for(int i=1; i<=n; i++) scanf("%d", &cost[i]);
        floyd();
        for(int i=0; ; i++){
            scanf("%d%d", &x, &y);
            if(x == -1 && y == -1) break;
            printf("From %d to %d :\n", x, y);
            printf("Path: ");
            print(x, y);
            printf("Total cost : %d\n", d[x][y]);
            puts("");
        }
    }
    return 0;
}

PS:真的学习了,第一次写Floyd的打印路径,还是按字典序,真是太神奇了~~~

时间: 2024-10-20 17:10:49

hdu 1385 Minimum Transport Cost (Floyd + 字典序打印路径)的相关文章

HDU - 1385 Minimum Transport Cost(floyd+字典序)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1385 题意:给出一个邻接矩阵(对应位置的值代表两个顶点之间的花费),并且到达另外一个位置还要加上那个位置对应的额外花费. 然后求出最少的花费和起点到终点的路径(如果两条路径花费一样,求出字典序最小的) 求任意两点间的最小花费,一般都采用Floyd.Floyd就是一个简单的dp思想,在用Floyd的时候记录一下路径就可以了. 这里要求字典序,可以在路径相等的时候再次进行判断一下,取小的顺序. 1 #i

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

HDU 1385 大意: 有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度. 如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费). 现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和. 求最小花费,如果有多条路经符合,则输出字典序最小的路径. 思路: Floyd求最短路,打印路径即可. 1 /*--------------------------------------------------------

HDU 1385 Minimum Transport Cost 最短路径题解

本题就是使用Floyd算法求所有路径的最短路径,并且需要保存路径,而且更进一步需要按照字典顺序输出结果. 还是有一定难度的. Floyd有一种很巧妙的记录数据的方法,大多都是使用这个方法记录数据的. 不过其实本题数据不是很大,一般太大的数据也无法使用Floyd,因为效率是O(N^3). 所以其实也可以使用一般的Floyd算法,然后增加个三维数组记录数据.下面就是这种做法,0ms过了. #include <stdio.h> #include <vector> using std::v

hdu Minimum Transport Cost(按字典序输出路径)

 摘自:Think In Java 从技术角度说,OOP(面向对象程序设计)只是涉及抽象的数据类型.继承以及多形性,但另一些问题也可能显得非常重要.本节将就这些问题进行探讨.最重要的问题之一是对象的创建及破坏方式.对象需要的数据位于哪儿,如何控制对象的"存在时间"呢?针对这个问题,解决的方案是各异其趣的.C++认为程序的执行效率是最重要的一个问题,所以它允许程序员作出选择.为获得最快的运行速度,存储以及存在时间可在编写程序时决定,只需将对象放置在堆栈(有时也叫作自动或定域变量)或者静态

HDU 1385 Minimum Transport Cost (字典序打印最短路)

题意  给你一个无向图的邻接矩阵  和途径每个点需要的额外花费首尾没有额外花费  求图中某两点之间的最短路并打印字典序最小路径 要求多组点之间的就用floyd咯  打印路径也比较方便  nex[i][j]表示从i点到j点最短路的第一个途经点  那么如果路径中加入一个节点k后 nex[i][j]应该更新为nex[i][k]  因为要途径k了 #include<cstdio> #include<cstring> using namespace std; const int N = 10

HDU - 1385 Minimum Transport Cost(最短路+最小字典序路径)

题目大意:有N个村庄.过村庄时需要交一定的费用.现在问从村庄A,要运一批货物到村庄B,怎样走才能使费用达到最小,起始和终点都不用缴费 解题思路:这题借鉴了别人的思路,用字符串存储路径. 其实不用字符串也是可以处理的 #include <cstdio> #include <cstring> #include <queue> using namespace std; #define N 105 #define INF 0x3f3f3f3f struct Node { cha

hdu 1385 Minimum Transport Cost

BFS注意字典序的问题.WA了好多发. #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; const int maxn = 70; int n, cost[maxn][maxn],bb[maxn], ji[maxn]; struct abc{ int node, fei; i

HDOJ 1385 Minimum Transport Cost

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7007    Accepted Submission(s): 1791 Problem Description These are N cities in Spring country. Between each pair of cities

Minimum Transport Cost Floyd 输出最短路

These are N cities in Spring country. Between each pair of cities there may be one transportation track or none. Now there is some cargo that should be delivered from one city to another. The transportation fee consists of two parts: The cost of the