Description
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 ... bNc d
e f ... g hwhere 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 : 21From 3 to 5 :
Path: 3-->4-->5 Total cost : 16From 2 to 4 :
Path: 2-->1-->5-->4 Total cost : 17Input
Output
Sample Input
Sample Output
Hint
#include <iostream>
using namespace std;const int INF = 99999999;
const int maxn = 1000; int n, s, e; int path[maxn][maxn]; int b[maxn]; int rode[maxn][maxn];int main()
{int i,j,k; while(~scanf("%d", &n) && n) { for(i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) { scanf("%d", &path[i][j]); if(path[i][j] == -1) { path[i][j] = INF; } rode[i][j] = j; } } for(i = 1; i <= n; ++i) { scanf("%d", &b[i]); } for(k = 1; k <= n; ++k) { for( i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) { if(path[i][k]+path[k][j]+b[k] < path[i][j]) { path[i][j] = path[i][k]+path[k][j]+b[k]; rode[i][j] = rode[i][k]; } else if(path[i][j] == path[i][k]+path[k][j]+b[k] && rode[i][j] > rode[i][k]) { rode[i][j] = rode[i][k]; } } } } while(~scanf("%d%d", &s, &e)) { if(s == -1 && e == -1) break; printf("From %d to %d :\nPath: %d", s, e, s); int u = s, v = e; while(s != e) { printf("-->%d", rode[s][e]); s = rode[s][e]; } printf("\n"); printf("Total cost : %d\n\n", path[u][v]); } } return 0; }