7-1 最短路径之Floyd(重在原理而不在题目)

请缩写程序,实现求有向网的最短路径的Floyd算法,因地点可能够是淡泊湖,宁静楼等等,这里简化成编号,要求能够查询出任意两点(用编号表示)间的最短路径及最小距离。

说明:1)顶点个数上限不超过100;2)距离权值上限不超过9998;

输入格式:

输出格式:

 

输入样例:

第一行,两个整数:vN和eN(图中顶点数和和边数)。
接下来是vN条边的信息:起点,终点,权值(三个数一行,以空格分隔);
最后两行是待查询的两组起点与终点的编号(每行一个查询,起点与终点编号间也是空格分隔)。

6 8
0 5 100
0 2 10
0 4 30
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
0 5
2 0

(三块信息:顶点数和边数;边的信息;两组需要查询的顶点信息)

输出样例:

共输出三行,前两行分别输出两组查询的结果:先是起点到终点的路径说明,再是距离,中间以冒号分隔。如果两个点间不可达,输出距离-1。最后一行是整个可达距离中最大距离的描述(若有多组,输入位置稍前的一组

Floyd算法是一种经典的动态规划算法,用于求解图中所有顶点之间的最短路径。其核心思想是通过逐步更新每对顶点之间的最短路径长度,最终得到所有顶点之间的最短路径。 ### Floyd算法的步骤 1. **初始化**:首先,我们需要一个邻接矩阵来表示图,其中`graph[i][j]`表示顶点`i`到顶点`j`的边的权重。如果`i`和`j`之间没有直接的边,则`graph[i][j]`设为无穷大(通常用一个大数表示)。 2. **三重循环更新**:使用三重循环遍历所有的顶点对`i`和`j`,并尝试通过顶点`k`作为中间节点来更新`graph[i][j]`。具体来说,如果通过`k`作为中间节点能够使得`i`到`j`的路径更短,则更新`graph[i][j]`。 ```python for k in range(n): for i in range(n): for j in range(n): if graph[i][k] + graph[k][j] < graph[i][j]: graph[i][j] = graph[i][k] + graph[k][j] ``` 3. **结果**:循环结束后,`graph[i][j]`将包含从顶点`i`到顶点`j`的最短路径长度。 ### Floyd算法的时间复杂度 Floyd算法的时间复杂度为O(n^3),其中n是图中顶点的数量。尽管时间复杂度较高,但Floyd算法在处理稠密图时非常有效。 ### Floyd算法的应用 - **求所有顶点对之间的最短路径**:Floyd算法可以直接求出所有顶点对之间的最短路径- **检测负权环**:如果在更新过程中发现某个顶点的最短路径长度可以无限减小,则说明图中存在负权环。 ### 示例 假设我们有一个图,其邻接矩阵如下: ``` 0 3 INF 5 2 0 INF INF INF 1 0 4 INF INF 2 0 ``` 应用Floyd算法后,得到的邻接矩阵为: ``` 0 3 7 5 2 0 6 4 3 1 0 4 5 3 2 0 ``` ### 总结 Floyd算法是一种简单而有效的方法,用于求解所有顶点之间的最短路径。尽管其时间复杂度较高,但在某些应用场景下仍然是最佳选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值