动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法
生活随笔
收集整理的這篇文章主要介紹了
动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考圖論算法(二)-最短路徑的Dijkstra [ 單源 ] 和Floyd[ 多源 ] 解法(JAVA )
這種算法也叫Floyd-Warshell算法,雖然和Warshell算法名字相近,算法思想也相近,但確實是兩種算法。對于一個帶權圖(無向或有向),全源最短路徑問題就是找出每個頂點到其他所有頂點之間的最短距離。我們用一個n階距離矩陣來記錄最短路徑的長度。需要注意的是該算法不適合帶負權的回路圖。
那么對于任意i到j的路徑可以表示為:vi, 頂點標號不大于k的一個中間頂點集,vj
我們在把這種路徑分成兩個不相交的情況,
情況一:子集中不將第k個頂點作為中間頂點。在這種情況下,路徑所包含的中間頂點的編號都不大于k-1;
情況二:子集中不將第k個頂點作為中間頂點。在這種情況下,頂點vk在中間頂點中,且出現過一次。
上述兩種情況可以由下圖表示:
下面是一個實例用來展示算法的過程:
Input:
4 5
1 3 3
2 1 2
3 2 7
4 1 6
3 4 1
Output:
0 10 3 4?
2? 0? 5 6?
7? 7? 0 1?
6 16 9 0?
完整代碼如下:
import java.util.Scanner;public class minPath {static int[][] e = new int[10][10];static int n, m;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (i == j) {e[i][j] = 0;} else {e[i][j] = 99999999;}}}for (int i = 1; i <= m; i++) {int a = input.nextInt();int b = input.nextInt();int c = input.nextInt();e[a][b] = c;}floyd();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {System.out.print(e[i][j] + " ");}System.out.println();}}public static void floyd() {for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (e[i][j] > e[i][k] + e[k][j]) {e[i][j] = e[i][k] + e[k][j];}}}}} }總結
以上是生活随笔為你收集整理的动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: window.open()详解
- 下一篇: 新版的sublime text 3无法设