http://acm.hdu.edu.cn/showproblem.php?pid=1385
题意: 找一个路径使得从一个地方坐的士到另一个地方花费最小,其中除了起点和终点,途中经过的站点要收费
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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <set>
//#include <map>
#include <queue>
#include <utility>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
//#include <ctime>
#include <ctype.h>
using namespace std;
#define inf 999999999 //用0x3fffffff太大溢出,纠结了良久
#define M 205
int dist[M][M], n, b[M], path[M][M];
void floyd ()
{
int i, j, k;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
path[i][j] = j; //记录路径数组初始化,表示从i到j经过的第一个站
for (k = 1; k <= n; k++)
{
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
int tp = dist[i][k] + dist[k][j] + b[k];
//溢出之地,因为+了b[k],其实先判断是否有路会更保险
if (tp < dist[i][j])
dist[i][j] = tp, path[i][j] = path[i][k];
else if (tp == dist[i][j] && path[i][k] < path[i][j])
path[i][j] = path[i][k]; //按字典序记录路径
}
}
}
}
int main()
{
int i, j, u, v, tp;
while (scanf ("%d", &n), n)
{
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
scanf ("%d", dist[i]+j);
if (dist[i][j] == -1)
dist[i][j] = inf;
}
}
for (i = 1; i <= n; i++)
scanf ("%d", b+i);
floyd();
while (scanf ("%d%d", &u, &v), (u != -1 || v != -1))
{
printf ("From %d to %d :\n", u, v);
printf ("Path: %d", u);
tp = u;
while (u != v)
{
printf ("-->%d", path[u][v]);
u = path[u][v];
}
printf ("\nTotal cost : %d\n\n", dist[tp][v]);
}
}
return 0;
}
分享到:
相关推荐
**Floyd最短路径算法详解** Floyd-Warshall算法是一种经典的解决图中所有顶点对最短路径问题的算法,由美国计算机科学家Robert W. Floyd于1962年提出。该算法的核心思想是逐步考虑更多的中间节点,通过动态规划的...
**Floyd最短路径算法详解** Floyd-Warshall算法,通常简称为Floyd算法,是一种在图中寻找所有顶点对之间最短路径的有效算法。由Robert W. Floyd于1962年提出,该算法的核心思想是通过动态规划逐步增加中间节点,以...
"Floyd_路径规划_Floyd算法_dynamicdijkstra"这一主题主要涵盖了计算机科学中的路径规划问题,特别是Floyd算法的运用以及与Dijkstra算法的比较。本文将深入探讨Floyd算法的核心思想、实现过程、适用场景以及它与动态...
求最短路径的Floyd算法实现,无向图和有向图均适用。1先区别有向图和无向图,2输入顶点数和边数并检查合法性,3输入每边的起点、终点、权重并检查合法性,并初始化邻接矩阵和路径矩阵,4调用自定义函数Floyd
**Floyd最短路径算法详解** Floyd-Warshall算法,通常称为Floyd算法,是图论中的一个著名算法,用于解决多源最短路径问题。这个算法由Robert Floyd在1962年提出,其核心思想是通过迭代的方式逐步完善最短路径信息,...
标题“floyd_floyd最短路径算法_最短路径矩阵_最短路径_只需要改邻接矩阵_”指出我们要讨论的是弗洛伊德(Floyd)算法,这是一种在图中寻找所有节点对之间最短路径的经典算法。关键词“最短路径矩阵”是指用于存储图...
Floyd最短路径算法利用三层循环实现弗洛伊德最短路径算法。
**Floyd最短路径算法详解** Floyd-Warshall算法是一种经典的图论算法,用于解决在加权图中寻找所有节点对之间的最短路径问题。它由Robert Floyd于1962年提出,适用于有权重的完全图。该算法的核心思想是通过动态...
标题中的"Floyd最短路径程序(MFC)"指的是利用Floyd-Warshall算法在MFC(Microsoft Foundation Classes)框架下开发的一个图形用户界面程序,用于计算图中所有顶点之间的最短路径。MFC是微软提供的C++类库,用于构建...
2. "POJ2516-Minimum Cost.doc":这可能是一个Word文档,详细记录了解题思路、算法解释、代码注释或者是运行结果截图等。这种文档形式有助于非程序员理解问题和解决方案。 综合以上信息,我们可以知道"Minimum Cost...
Floyd算法,也被称为Floyd-Warshall算法,是图论中的一个重要算法,主要用于求解图中所有顶点之间的最短路径。这个算法由Robert Floyd和Stephen Warshall独立提出,因此得名。在计算机科学中,它常被用于解决网络...
该算法由Robert Floyd在1962年提出,适用于解决多源最短路径问题,即寻找从图中的一个节点到其他所有节点的最短路径。在MATLAB中实现这个算法,我们可以利用其强大的矩阵运算能力,高效地处理这类问题。 **算法原理...
Floyd算法的核心思想是通过逐步考虑所有可能的中间节点来寻找最短路径。初始时,算法假设每个节点到自身的距离为0,直接相邻节点之间的距离为边的权重。然后,对于每一对节点i和j,算法会尝试通过所有的中间节点k来...
最短路径floyd算法实现最短路径floyd算法实现最短路径floyd算法实现最短路径floyd算法实现
**Floyd算法求解最短路径问题(C++源码)** Floyd-Warshall算法是一种用于解决图中所有顶点对之间的最短路径问题的动态规划方法。它由美国计算机科学家Robert W. Floyd在1962年提出,因此得名。这个算法的核心思想...
**Floyd最短路径算法**,也称为Floyd-Warshall算法,是计算机科学中用于求解图论问题的一种经典算法。它能有效地找到图中所有顶点对之间的最短路径,尤其适用于处理大型网络中的路径查找问题。Floyd算法的核心思想是...
Floyd算法,又称为Floyd-Warshall算法,是解决图论问题中的一个经典算法,主要用于寻找图中所有顶点对之间的最短路径。它是由美国计算机科学家Robert W. Floyd在1962年提出的。这个算法基于动态规划的思想,能够找出...
### Floyd最短路径算法的动态优化 #### 摘要及背景 本文介绍了一种针对Floyd最短路径算法的动态优化技术。Floyd算法是一种经典的解决所有顶点对之间最短路径问题的方法,适用于带权重的有向图。传统的Floyd算法...
Floyd-Warshall算法的核心思想是动态规划,它通过逐步考虑所有可能的中间节点来更新最短路径。算法的基本步骤如下: 1. 初始化:对于一个n个节点的图,构建一个n×n的邻接矩阵G,其中G[i][j]表示从节点i到节点j的...
在选择配送中心的众多方法中,Floyd最短路径算法作为图论和网络分析方法的一种,因其能在任意两点之间找到最短路径的特性而被广泛应用于配送中心选址。 Floyd最短路径算法是由Robert W. Floyd于1962年提出的,其...