ACM学习之路___HDU 1385(带路径保存的 Floyd)

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

  简单带路径保存的Floyd(新手没啥经验,不熟练,记下方便回味)

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int MAXINT = 1<<25;
 5 int path[205][205];
 6 int num[205][205];
 7 int num1[205];
 8 int n;
 9 void floyd()
10 {
11     for(int k=1 ; k<=n ; k++)
12         for(int i=1 ; i<=n ; i++)
13             for(int j=1 ; j<=n ; j++)
14             {
15                 if(num[i][j] > (num[i][k]+num[k][j]+num1[k]) )
16                 {
17                     num[i][j] = num[i][k]+num[k][j]+num1[k];
18                     path[i][j] = path[i][k];
19                 }
20                 else if(num[i][j] == num[i][k]+num[k][j]+num1[k])
21                 {
22                     if(path[i][j] > path[i][k])
23                         {
24                             path[i][j] = path[i][k];
25                             num[i][j] = num[i][k]+num[k][j]+num1[k];
26                         }
27                 }//attention 当存在多条最短路时,选取后驱小的路
28             }
29 }
30 void print(int a,int b)
31 {
32     if(a == b)
33     {
34         printf("%d\n",b);
35         return;
36     }
37     printf("%d-->",a);
38     a=path[a][b];
39     print(a,b);
40 }//路径输出函数
41
42 int main()
43 {
44     int i,j,a,b;
45     while(scanf("%d",&n),n)
46        {
47         for(i=1 ; i<=n ; i++)
48           for(j=1 ; j<=n ; j++)
49             {
50                 scanf("%d",&num[i][j]);
51                 if(num[i][j]==-1)
52                     num[i][j]=MAXINT;
53                 path[i][j]=j;//记后驱,方便输出
54             }
55             for(i=1 ; i<=n ; i++)
56                 scanf("%d",&num1[i]);
57             floyd();
58             while(scanf("%d%d",&a,&b))
59             {
60                 if(a == -1 && b == -1)
61                     break;
62                 printf("From %d to %d :\n",a,b);
63                 printf("Path: ");
64                 print(a,b);
65                 printf("Total cost : %d\n\n",num[a][b]);
66             }
67        }
68     return 0;
69 }
时间: 2024-10-21 05:27:13

ACM学习之路___HDU 1385(带路径保存的 Floyd)的相关文章

ACM学习之路___HDU 5723(kruskal + dfs)

Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 4487 Accepted Submission(s): 1131 Problem Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n

ACM学习之路————一个大整数与一个小整数不得不说得的秘密

这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[1000],result[1000]; int main() { long long divis; int n,i,k,flag,len; char c; while

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

Peng Gong:我的算法学习之路

原文出处: Lucida (@peng_gong) 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB

转----我的算法学习之路

我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 原文链接:http://zh.lucida.me/blog/on-learning-algorithms/ 原文作者:Lucida 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程

OpenGL学习之路(四)

1 引子 上次读书笔记主要是学习了应用三维坐标变换矩阵对二维的图形进行变换,并附带介绍了GLSL语言的编译.链接相关的知识,之后介绍了GLSL中变量的修饰符,着重介绍了uniform修饰符,来向着色器程序传入输入参数. 这次读书笔记的内容相对有趣一些,主要是和园友们分享讨论三维坐标变换矩阵在三维几何体上的应用,以及介绍一下如何实现三维图形与用户操作的交互.这一次笔记在三维编程中也是非常重要的——我们最后开发的三维程序最终就是要和目标用户进行交互的. 之前一直没有在博客上放过gif格式的动画图片,

一位Google程序员的算法学习之路(转)

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本

ACM学习资料整理

ACM学习资料整理 声明:参考泥瓦匠BYSocket.POJ题目分类推荐 (很好很有层次感)整理所得 1 推荐题库 ?http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以baidu 一个叫NOCOW 的网站.   ?http://livearchive.onlinejudge.org/ 上面有全部的赛区真题,绝大部分都可以提交,不适合当题库刷,不过在这里找题非常方便.