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

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

核心代码如下:

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]  
							map[i][j] > map[i][k] + map[k][j] ) {
						map[i][j] = map[i][k] + map[k][j];
					}
				}
			}
		}

下面看例子:

图论最短路径算法-Floyd算法-JAVA代码实现_第1张图片

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

实现如下:

图论最短路径算法-Floyd算法-JAVA代码实现_第2张图片

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

图论最短路径算法-Floyd算法-JAVA代码实现_第3张图片

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

图论最短路径算法-Floyd算法-JAVA代码实现_第4张图片

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

图论最短路径算法-Floyd算法-JAVA代码实现_第5张图片


其实基本思想就是:最开始只允许经过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!!!

你可能感兴趣的:(图论最短路径算法-Floyd算法-JAVA代码实现)