日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划在求解全源最短路径中的应用(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算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。