题目链接:

https://vjudge.net/problem/ZOJ-1456

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

 /*
题意描述
给出路径花费矩阵,路途中经过结点的过路费,问从a到b的短路径是多少,并输出路径,如果最小花费相同,输出路径字典序最小的那条
解题思路
使用Floyd,每次检测到某个节点能够松弛某条路径,就更新直接后继,二维数组记录路径的方法。
*/
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std; const int inf = ;
const int maxn = ;
int e[maxn][maxn], suc[maxn][maxn], b[maxn];
int n;
void Floyd(); int main()
{
while(scanf("%d", &n) == && n) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
scanf("%d", &e[i][j]);
if(e[i][j] == -)
e[i][j] = inf;
suc[i][j] = j;//从i到j的直接后继初始化为j
}
}
for(int i = ; i <= n; i++) {
scanf("%d", &b[i]);
}
Floyd();
int u, v;
while(scanf("%d%d", &u, &v) == && u + v != -) {
printf("From %d to %d :\nPath: %d", u, v, u);
int tp = u;
while(tp != v) {//一直输出u到v的直接后继,直到后继就是v
printf("-->%d", suc[tp][v]);
tp = suc[tp][v];
}
printf("\nTotal cost : %d\n\n", e[u][v]);
}
}
return ;
} void Floyd() {
for(int k = ; k <= n; k++) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
if(e[i][j] > e[i][k] + e[k][j] + b[k]) {
e[i][j] = e[i][k] + e[k][j] + b[k];
suc[i][j] = suc[i][k];//如果k点能够使从i到j的路径松弛,那么就将i到j的直接后继更新为从i到k的直接后继
} else if(e[i][j] == e[i][k] + e[k][j] + b[k] && suc[i][j] > suc[i][k])
suc[i][j] = suc[i][k];
}
}
}
}

ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)的更多相关文章

  1. ZOJ 1456 Minimum Transport Cost(floyd+后继路径记录)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1456 题意:求最短路并且输出字典序最小的答案. 思路:如果用dijkstr ...

  2. Minimum Transport Cost(floyd+二维数组记录路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  3. hdu 1385 Minimum Transport Cost (Floyd)

    Minimum Transport CostTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  4. Minimum Transport Cost Floyd 输出最短路

    These are N cities in Spring country. Between each pair of cities there may be one transportation tr ...

  5. HDU 1385 Minimum Transport Cost (最短路,并输出路径)

    题意:给你n个城市,一些城市之间会有一些道路,有边权.并且每个城市都会有一些费用. 然后你一些起点和终点,问你从起点到终点最少需要多少路途. 除了起点和终点,最短路的图中的每个城市的费用都要加上. 思 ...

  6. HDU1385 Minimum Transport Cost (Floyd)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  7. hdu 1385 Minimum Transport Cost(floyd &amp;&amp; 记录路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  8. HDU 1385 Minimum Transport Cost( Floyd + 记录路径 )

    链接:传送门 题意:有 n 个城市,从城市 i 到城市 j 需要话费 Aij ,当穿越城市 i 的时候还需要话费额外的 Bi ( 起点终点两个城市不算穿越 ),给出 n × n 大小的城市关系图,-1 ...

  9. HDU 1385 Minimum Transport Cost (Dijstra 最短路)

    Minimum Transport Cost http://acm.hdu.edu.cn/showproblem.php?pid=1385 Problem Description These are ...

随机推荐

  1. chrome升级后出现滚动条无法滚动

    最近升级chrome最新版本后,导致项目中功能页面的局部滚动条无法滚动(心里暗骂了很久),无论怎么滚动都是最外层的滚动条响应... 1.猜想:尼玛google应该不会干事件流混乱这种事,pass: 2 ...

  2. SprirngBoot微服务之间的交互—— restTemplate

    一 例:需要在storage服务中请求utils服务的某个接口(两个服务都已向同一台eureka server 注册) 步骤: 1 在utils创建需被调用的接口 @RestController @R ...

  3. 2019.02.21 bzoj1249: SGU277 HERO 动态凸包(set+凸包)

    传送门 题意:动态插入点,维护凸包面积. 思路:用setsetset维护极角序来支持面积查询即可. 然后注意选原点的时候要从初始三个点随机平均系数来避免精度误差. 代码: #include<bi ...

  4. selenium_unittest基本框架

    from selenium import webdriver import unittest import time #创建类引入unitest.testcase用例库 class BaiDu_tes ...

  5. ABP框架系列之三十二:(Logging-登录)

    Server Side(服务端) ASP.NET Boilerplate uses Castle Windsor's logging facility. It can work with differ ...

  6. HDU 1171 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 基础的01背包,求出总值sum,背包体积即为sum/2 #include<stdio.h> # ...

  7. USART of STM32

    /*************************************************************************** * 文件名:USART.h * * 编写人:离 ...

  8. Alpha 冲刺(1)

    Alpha 冲刺 (1/10)   Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 ...

  9. Codeforces828 B. Black Square

    B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  10. RSA 算法

    RSA 算法  from http://www.matrix67.com/blog/archives/5100 所有工作都准备就绪,下面我们可以开始描述 RSA 算法了. 首先,找两个质数,比如说 1 ...