Floyd算法——保存路径——输出路径 HDU1385

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1385

参考 http://blog.csdn.net/shuangde800/article/details/8075165

题目大意:

有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度。

如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费)。

现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和。

求最小花费,如果有多条路经符合,则输出字典序最小的路径。

解析:

直接跑一边Floyd算法就好    用一个二维数组保存路径path[ i ][ j ]表示第i个节点到第j个节点经过的第一个点(例如1->2->5->4,path[1][4]=2,path[2][4]=5,path[5][4]=5)

AC代码

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 #include <iostream>
 6 #include <sstream>
 7 #include <algorithm>
 8 #include <string>
 9 #include <queue>
10 #include <map>
11 #include <vector>
12 using namespace std;
13 const int maxn = 10005;
14 const int maxm = 1e4+10;
15 const int inf = 0x3f3f3f3f;
16 const double epx = 1e-10;
17 typedef long long ll;
18 int n;
19 int w[maxn][maxn];
20 int path[maxn][maxn];
21 int tax[maxn];
22 void init()
23 {
24     for(int i=0;i<=n;i++)
25     {
26         for(int j=0;j<=n;j++)
27         {
28             if(i!=j)
29                 w[i][j]=inf;
30             else
31                 w[i][j]=0;     //自己到自己设为0
32             path[i][j]=j;    //初始化为j
33         }
34     }
35 }
36 void Floyd()
37 {
38     for(int k=1;k<=n;k++)
39     for(int i=1;i<=n;i++)
40     for(int j=1;j<=n;j++)
41         if(w[i][k]!=inf&&w[k][j]!=inf)
42         {
43             int temp=w[i][k]+w[k][j]+tax[k];    //tax[]是过路费
44             if(w[i][j]>temp)                   //松弛操作的时候,顺带更新路径
45             {
46                 w[i][j]=temp;
47                 path[i][j]=path[i][k];
48             }
49             else if(w[i][j]==temp&&path[i][j]>path[i][k])//字典序最小,不要求字典序的话可直接省略
50             {
51                 path[i][j]=path[i][k];
52             }
53         }
54 }
55 int main()
56 {
57     while(cin>>n&&n)
58     {
59         init();
60         for(int i=1;i<=n;i++)
61         {
62             for(int j=1;j<=n;j++)
63             {
64                 cin>>w[i][j];
65                 if(w[i][j]==-1)
66                     w[i][j]=inf;
67             }
68         }
69         for(int i=1;i<=n;i++)
70             cin>>tax[i];
71         Floyd();
72         int s,e;
73         while(cin>>s>>e&&s!=-1&&e!=-1)
74         {
75             printf("From %d to %d :\n",s,e);
76             printf("Path: ");
77             int u=s;
78             printf("%d",u);                 //打印路径
79             while(u!=e)
80             {
81                 printf("-->%d",path[u][e]);
82                 u=path[u][e];
83             }
84             printf("\n");
85             printf("Total cost : %d\n\n",w[s][e]);
86         }
87
88     }
89 }

原文地址:https://www.cnblogs.com/stranger-/p/8366904.html

时间: 2024-07-31 06:14:37

Floyd算法——保存路径——输出路径 HDU1385的相关文章

vijos1635 SPFA和FLOYD算法如何打印路径

之前打的spfa或是floyd都只是用来求最短路,对于如何打印路径问题一点都没有概念 可能也是因为对于原理没有很理解的缘故? 总之,之后赶紧看了一下,现在总算是明白了.....MARK一下自己的理解 早晨碰到了一题挺裸的最短路问题:vijos1635 1.首先说说spfa的方法: 其实自己之前打的最多的spfa是在网格上的那种,也就是二维的 一维的需要邻接表+queue 以及对于queue的操作,自己也是醉了 这里贴一个模板(不含打印路径): #include<cstdio> #include

hihocoder-1089-最短路径Floyd算法

hihocoder-1089-最短路径Floyd算法 #1089 : 最短路径·二:Floyd算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 由于没有肚子的压迫,小Hi和小Ho决定好好的逛一逛这个鬼屋,逛着逛着,小Hi产生了这样的问题:鬼屋中任意

[Python] 弗洛伊德(Floyd)算法求图的直径并记录路径

相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两点间的最短路径算法,称为多源最短路径算法. 常用的路径算法有: Dijkstra算法 SPFA算法\Bellman-Ford算法 Floyd算法\Floyd-Warshall算法 Johnson算法 其中最经典的是Dijkstra算法和Floyd算法.Floyd算法是多源最短路径算法,可以直接求出图

Floyd最短路(带路径输出)

摘要(以下内容来自百度) Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似. 该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 简介编辑 在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法.算法的单个执行将找到所有顶点对之间的最短路径的长度(加权). 虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来

HD1385Minimum Transport Cost(Floyd + 输出路径)

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

hdu 1385 Floyd 输出路径

Floyd 输出路径 Sample Input50 3 22 -1 43 0 5 -1 -122 5 0 9 20-1 -1 9 0 44 -1 20 4 05 17 8 3 1 //收费1 3 //起点 终点3 52 4-1 -10 Sample OutputFrom 1 to 3 :Path: 1-->5-->4-->3Total cost : 21 From 3 to 5 :Path: 3-->4-->5Total cost : 16 From 2 to 4 :Path

hiho一下 第二十四周---最短路径&#183;二:Floyd算法

最短路径·二:Floyd算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 由于没有肚子的压迫,小Hi和小Ho决定好好的逛一逛这个鬼屋,逛着逛着,小Hi产生了这样的问题:鬼屋中任意两个地点之间的最短路径是多少呢? 提示:其实如果你开心的话,完全可以从

多源最短路Floyd 算法————matlab实现

弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离. 假设图G中顶点个数为N,则需要对矩阵S进行N次更新.初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值:如果i和j不相邻,则a[i][j]=∞

每一对顶点间最短路径的Floyd算法

Floyd思想可用下式描述: A-1[i][j]=gm[i][j] A(k+1)[i][j]=min{Ak[i][j],Ak[i][k+1]+Ak[K+1][j]}    -1<=k<=n-2 该式是一个迭代公式,Ak表示已考虑顶点0,1,.......,k等k+1个顶点之后各顶点之间的最短路径,即Ak[i][j]表示由Vi到Vj已考虑顶点0,1,.......,k等k+1个顶点的最短路径;在此基础上再考虑顶点k+1并求出各顶点在考虑了顶点k+1之后的最短路径,即得到Ak+1.每迭代一次,在从