博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(Floyd求最短路)Minimum Transport Cost (hdu1385)
阅读量:5817 次
发布时间:2019-06-18

本文共 2742 字,大约阅读时间需要 9 分钟。

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

Input

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

转载于:https://www.cnblogs.com/lengxia/p/4387798.html

你可能感兴趣的文章
Linux VSFTP服务器
查看>>
DHCP中继数据包互联网周游记
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
项目管理心得
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>
通过vb.net 和NPOI实现对excel的读操作
查看>>
TCP segmentation offload
查看>>
java数据类型
查看>>
数据结构——串的朴素模式和KMP匹配算法
查看>>
FreeMarker-Built-ins for strings
查看>>
验证DataGridView控件的数据输入
查看>>
POJ1033
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
一维数组
查看>>
Linux学习笔记之三
查看>>
CentOS 6.6 FTP install
查看>>
图解Ajax工作原理
查看>>