1. 程式人生 > 實用技巧 >常用十大演算法(九)— 弗洛伊德演算法

常用十大演算法(九)— 弗洛伊德演算法

常用十大演算法(九)— 弗洛伊德演算法

部落格說明

文章所涉及的資料來自網際網路整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯絡本人刪除,謝謝!

介紹

  • 弗洛伊德(Floyd)演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法

最短路徑問題

  • 勝利鄉有7個村莊(A, B, C, D, E, F, G)
  • 各個村莊的距離用邊線表示(權) ,比如 A – B 距離 5公里
  • 問:如何計算出各村莊到 其它各村莊的最短距離?

思路

  • 設定頂點vi到頂點vk的最短路徑已知為Lik,頂點vk到vj的最短路徑已知為Lkj,頂點vi到vj的路徑為Lij,則vi到vj的最短路徑為:min((Lik+Lkj),Lij),vk的取值為圖中所有頂點,則可獲得vi到vj的最短路徑
  • 至於vi到vk的最短路徑Lik或者vk到vj的最短路徑Lkj,是以同樣的方式獲得

程式碼實現

package com.atguigu.floyd;

import java.util.Arrays;

public class FloydAlgorithm {

	public static void main(String[] args) {
		char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
		int[][] matrix = new int[vertex.length][vertex.length];
		final int N = 65535;
		matrix[0] = new int[] { 0, 5, 7, N, N, N, 2 };
		matrix[1] = new int[] { 5, 0, N, 9, N, N, 3 };
		matrix[2] = new int[] { 7, N, 0, N, 8, N, N };
		matrix[3] = new int[] { N, 9, N, 0, N, 4, N };
		matrix[4] = new int[] { N, N, 8, N, 0, 5, 4 };
		matrix[5] = new int[] { N, N, N, 4, 5, 0, 6 };
		matrix[6] = new int[] { 2, 3, N, N, 4, 6, 0 };
		
		Graph graph = new Graph(vertex.length, matrix, vertex);
		graph.floyd();
		graph.show();
	}

}


class Graph {
	private char[] vertex; 
	private int[][] dis;
	private int[][] pre;
	
	public Graph(int length, int[][] matrix, char[] vertex) {
		this.vertex = vertex;
		this.dis = matrix;
		this.pre = new int[length][length];
		for (int i = 0; i < length; i++) {
			Arrays.fill(pre[i], i);
		}
	}

	public void show() {
		char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
		for (int k = 0; k < dis.length; k++) {
			for (int i = 0; i < dis.length; i++) {
				System.out.print(vertex[pre[k][i]] + " ");
			}
			System.out.println();
			for (int i = 0; i < dis.length; i++) {
				System.out.print("("+vertex[k]+"µ½"+vertex[i]+"µÄ×î¶Ì·¾¶ÊÇ" + dis[k][i] + ") ");
			}
			System.out.println();
			System.out.println();

		}

	}
	
	public void floyd() {
		int len = 0; 
		for(int k = 0; k < dis.length; k++) { 
			for(int i = 0; i < dis.length; i++) {
				for(int j = 0; j < dis.length; j++) {
					len = dis[i][k] + dis[k][j];
					if(len < dis[i][j]) {
						dis[i][j] = len;
						pre[i][j] = pre[k][j];
					}
				}
			}
		}
	}
}

感謝

尚矽谷

以及勤勞的自己,個人部落格GitHub