【算法】图的应用之求两个城市间的最短路径--FloydWarshall算法

题目是这样的,如下图所示,一共有4个城市,8条公路。

有的城市建有直接的公路,而有的城市则没有,公路之间的数字显示的是长度。

由此,可以算出一个城市到另外一个城市的最短路径。


代码的实现:

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int e[10][10], k, i, j, n, m, t1, t2, t3;
	int inf = 99999999;
	printf("请输入顶点数n和边数m->\n");
	scanf("%d %d", &n, &m);

	//初始化
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j<= n; j++)
		{
			if (i == j)
			{
				e[i][j] = 0;
			}
			else
			{
				e[i][j] = inf;
			}
		}
	}

	printf("请输入顶点t1,顶点t2,以及t1和t2之间的距离->\n");
	for (i = 1; i <= m;
### Floyd-Warshall算法简介 Floyd-Warshall算法是一种用于解多源最短路径的经典动态规划算法,它能够在一张带权重的上找到每一对节点之间的最短距离。该算法的时间复杂度为 \(O(V^3)\),其中 \(V\) 是中顶点的数量。尽管其效率不如某些单源最短路径算法(如Dijkstra),但它具有简单易懂的特点,并能处理带有负权边的情况(只要不存在负环即可)。 以下是基于Java实现的Floyd-Warshall算法代码示例以及详细的解释: --- ### Java 实现 Floyd-Warshall 算法 ```java public class FloydWarshallAlgorithm { public static void floydWarshall(int[][] graph, int vertices) { // 初始化距离矩阵 int[][] dist = new int[vertices][vertices]; // 将输入的距离矩阵复制到dist数组中 for (int i = 0; i < vertices; i++) { for (int j = 0; j < vertices; j++) { dist[i][j] = graph[i][j]; // 初始状态下的距离等于原中的权重 } } // 动态规划的核心部分:逐步更新中间节点k的影响 for (int k = 0; k < vertices; k++) { // 遍历所有可能作为中间节点的顶点k for (int i = 0; i < vertices; i++) { // 起始节点i for (int j = 0; j < vertices; j++) { // 终止节点j if (dist[i][k] != Integer.MAX_VALUE && dist[k][j] != Integer.MAX_VALUE && dist[i][k] + dist[k][j] < dist[i][j]) { // 如果经过k节点可以使从i到j更近,则更新距离 dist[i][j] = dist[i][k] + dist[k][j]; } } } } // 打印最终的结果矩阵 System.out.println("以下是从各顶点出发到达其他顶点的最短路径:"); printSolution(dist); } private static void printSolution(int[][] dist) { int n = dist.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (dist[i][j] == Integer.MAX_VALUE) { System.out.print("INF\t"); } else { System.out.print(dist[i][j] + "\t"); } } System.out.println(); } } public static void main(String[] args) { int INF = Integer.MAX_VALUE; // 定义一个加权邻接矩阵表示的 int[][] graph = { {0, 5, INF, 10}, {INF, 0, 3, INF}, {INF, INF, 0, 1}, {INF, INF, INF, 0} }; int vertices = graph.length; floydWarshall(graph, vertices); // 计算并打印结果 } } ``` #### 代码解析 1. **初始化阶段**: 使用二维数组 `graph` 表示的邻接矩阵形式,其中无穷大值 (`Integer.MAX_VALUE`) 表示两个顶点之间无直接连接[^4]。 2. **核心逻辑**: - 外层循环遍历每一个可能的中间节点 \(k\)。 - 对于每一组起始节点 \(i\) 和终止节点 \(j\) 的组合,判断是否存在一条通过中间节点 \(k\) 更优的路径。 - 若存在这样的路径,则更新当前最短路径长度。 3. **输出结果**: 最终得到的是一个完整的距离矩阵,记录了任意两节点间最小代价路径的信息。 --- ### 应用场景与注意事项 - **应用场景**: - 地理信息系统(GIS): 如城交通网络分析、物流配送路线优化等[^3]。 - 社交网络研究: 探索社交关系网中最紧密联系的人群结构。 - **注意要点**: - 中不应含有负权回路;否则可能导致错误结果或无限循环。 - 时间复杂度较高 (\(O(V^3)\)),因此适合较小规模的数据集[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值