图论最短路径算法-Floyd算法-JAVA代码实现

本文介绍Floyd算法的核心思想及其实现过程,通过五个for循环来寻找任意两点间的最短路径,提供了一个Java实现示例,并逐步展示了算法如何更新路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Floyd的核心代码只有三个for循环,也就是五行代码,实现起来很简单(原谅我使用如此恶劣的用词)的哟!

核心代码如下:

for(int k = 1; k <= m; k++) {//可以理解为中转站点
			for (int i = 1; i <= m; i++) {//行
				for (int j = 1; j <= m; j++) {//列
					if ( <span style="color:#cc0000;">map[i][k] <min && map[k][j] < min &&</span> 
							map[i][j] > map[i][k] + map[k][j] ) {
						map[i][j] = map[i][k] + map[k][j];
					}
				}
			}
		}

下面看例子:

我们用邻接矩阵对图进行存储:

实现如下:

现在只允许经过一号顶点,求任意两点之间的最短路径,变换后如下图:

现在只允许经过1号和2号顶点,变换后如下图:

以此类推最近任意两点之间的最短路径为:


其实基本思想就是:最开始只允许经过1号顶点进行中转,接下来只允许经过1号和2号顶点进行中转………允许经过n~1号所有的顶点进行中转,求任意两点之间的最短路径。

从 i 号顶点到 j 号顶点只经过前 k 号点的最短路径。

下面看java代码:

import java.util.Scanner;

//floyed算法
public class floyed {
	static int m, n;
	static int[][] map;
	static int min = 99999999;

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		m = sc.nextInt();
		n = sc.nextInt();
		map = new int[m + 1][m + 1];
		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= m; j++) {
				map[i][j] = min;

			}
			map[i][i] = 0;
		}
		for (int i = 1; i <= n; i++) {
			int p1 = sc.nextInt();
			int p2 = sc.nextInt();
			map[p1][p2] = sc.nextInt();
		}
		for (int k = 1; k <= m; k++) {
			for (int i = 1; i <= m; i++) {
				for (int j = 1; j <= m; j++) {
					if (map[i][k] < min && map[k][j] < min && map[i][j] > map[i][k] + map[k][j]) {
						map[i][j] = map[i][k] + map[k][j];
					}
				}
			}
		}

		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= m; j++) {
				System.out.print(map[i][j] + "  ");
			}
			System.out.println();
		}
	}

}
输入数据为:

4 8
1 2 2 
2 3 3 
1 3 6 
3 1 7 
1 4 4 
4 1 5 
3 4 1
4 3 12
输出数据为:

0  2  5  4  
9  0  3  4  
6  8  0  1  
5  7  10  0 

若有bug,不足望悉心指出,thanks!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值