图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )
一、Dijkstra算法
問題描述:求一個點到任意個點的距離
思路:單源最短路徑問題,使用Dijkstra算法
Input:
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
Output:
0 1 8 4 13 17
Dijkstra算法的時間復雜度為O(N^2)
這是采取鄰接矩陣存放數據的時間復雜度。而如果采用下面的鄰接表將會使算法的時間復雜度優化為O((M+N)logN)
鄰接表:
數據存儲思路:u[i],v[i],w[i] 代表存儲u[i]——->v[i]的兩個可連通的點,w[i]代表權值
first[u[i]]存放頂點u[i]的第一條邊編號,next[i]存放編號為i的邊的下一條邊
下面給出鄰接表定義和打印的代碼,感興趣的讀者可以將其運用到Dijkstra算法中
import java.util.Scanner;public class minPath {static int[] u = new int[6];static int[] v = new int[6];static int[] w = new int[6];static int[] first = new int[6];static int[] next = new int[6];static int n, m;static int k;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 1; i <= m; i++) {u[i] = input.nextInt();v[i] = input.nextInt();w[i] = input.nextInt();for (int j = 1; j <= n; j++) {first[i] = -1;}next[i] = first[u[i]];first[u[i]] = i;}for (int i = 1; i <= n; i++) {k = first[i];while (k != -1) {System.out.println(u[k] + " " + v[k] + " " + w[k]);k = next[k];}}} }對于單源最短路徑使用Dijkstra算法的確是一個好方法,但是如果是多源最短路徑問題呢?
當然,我們可以才用n次Dijkstra算法解決,但是下面的Floyd算法貌似給了我們更友好的解法
而且當出現帶有負權值的圖的時候,這Dijkstra算法就沒有辦法解決了,我在這篇文章整理了另一種算法來針對單源帶負權最短路徑問題。
圖論算法(三)–最短路徑 的Bellman-Flod [ 帶負權值圖 ] 的解法(JAVA )
二、Floyd算法
問題描述:有如下的地圖,求任意兩點之間的最短距離
思路:典型的多源最短路徑問題,這大可以使用n^2次深搜或者廣搜完成,但是下面的Floyd算法才是更巧妙、快速的一種算法
Input:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
Output:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
總結
以上是生活随笔為你收集整理的图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全源最短路径之弗洛伊德算法(C语言)
- 下一篇: sc.exe 详解