亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

單源最短路徑問題--Dijkstra算法和Floyd算法

2019-11-10 17:34:52
字體:
來源:轉載
供稿:網友

昨天復習了一下單源最短路徑問題,今天總結一下。

解決單源最短路徑問題,我們熟知的算法首先就是Dijkstra算法了。Dijkstra算法的核心就是貪心思想。我在以前的博客中也寫過這個算法:圖的拓撲排序、關鍵路徑、最短路徑算法 – C++實現,現在看以前的博客,我的代碼思路還是很清晰的。Dijkstra算法可以求出某一點到其他所有點的最短路徑,本文還將介紹一種可求出所有點對的最短路徑的算法——Floyd算法。

Dijkstra算法

Dijkstra算法是典型的單源最短路徑算法,用于計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,知道擴展到終點為之。Dijkstra算法的要求是圖中不存在負權邊。因為Dijkstra算法基于貪心策略,它是短視的。如果存在某個路徑上有負權邊,可能繞了幾圈得到的結果甚至是更優的,所以Dijkstra算法在有負權邊的圖應用上是失敗的。

Dijkstra算法的具體解釋我就不說了,如果不明白概念可參考這篇博客的概念解釋:最短路徑—Dijkstra算法和Floyd算法。

本文所有測試用例所用graph就是下面這幅圖片中的graph:

下面給出我的代碼:

#include <iostream>#include <vector>#include <iomanip>#include <limits.h>const int NUM_VERTICES = 5; //A B C D Evoid PRint_solution(std::vector<int>& dist, std::vector<int>& path){ for(auto i : dist) std::cout<<std::setw(3)<<i<<' '; std::cout<<std::endl; for(auto i : path) std::cout<<std::setw(3)<<i<<' '; std::cout<<std::endl;}void dijkstra(std::vector<std::vector<int>>& graph, int source){ std::vector<int> dist(NUM_VERTICES, 0), path(NUM_VERTICES, -1); for(int i=1; i<NUM_VERTICES; ++i){ dist[i] = graph[source][i] == 0 ? INT_MAX : graph[source][i]; path[i] = source; } std::vector<bool> visited(NUM_VERTICES, false); visited[source] = true; for(int i=0; i<NUM_VERTICES-1; ++i){ int min = INT_MAX; int min_index = -1; for(int j=0; j<NUM_VERTICES; ++j){ if(!visited[j] && dist[j] < min){ min = dist[j]; min_index = j; } } visited[min_index] = true; for(int k=0; k<NUM_VERTICES; ++k){ int weight = graph[min_index][k] == 0 ? INT_MAX : graph[min_index][k]; if(!visited[k] && weight != INT_MAX && dist[min_index] != INT_MAX && dist[min_index]+weight < dist[k]){ dist[k] = dist[min_index] + weight; path[k] = min_index; } } } print_solution(dist, path);}int main(){ std::vector<std::vector<int>> graph = {{0, 10, 0, 30, 100}, //A {0, 0, 50, 0, 0 }, //B {0, 0, 0, 0, 10 }, //C {0, 0, 20, 0, 60 }, //D {0, 0, 0, 0, 0 }};//E // A B C D E dijkstra(graph, 0); //param 0 means vertex 'A' return 0;}

輸出結果: 這里寫圖片描述

Dijkstra算法的時間復雜度是O(|E|+|V|2|)=O(V2)(參考:Dijkstra算法時間復雜度)。對于稠密的圖來說,|E| 就是|V|^2,所以Dijsstra算法中遍歷dist[min_index]+weigth那個循環加上最外層循環時間復雜度為θ(|V|2),對于稠密圖,這就是最優的了,總的時間復雜度正好是θ(|E|+|V|2)=θ(|V|2+|V|2)=O(|V|2)。但是對于非稠密圖,這個 |E| 實際沒這么大,甚至 |E|=|V|,這個算法就未免效率低下了。

優化法方法是使用最小堆,我們dist[min_Index]+weight小于dist[k]時,將新的dist[k]的值插入最小堆;在上面查找最小值的操作中,每次從最小堆中取出最小值,并且檢查是否visited,如果沒visited,那就找到新的頂點了。改進后的算法時間復雜度是O(|E|lg|V|)。

Floyd算法

Floyd算法是解決任意兩點間最短路徑的一種算法,可以正確處理負權圖的最短路徑問題。

上面的Dijkstra算法求出了某個點到其他所有點的最短路徑,我們要求所有點對的最短路徑,有這樣一種思路,就是再外面再循環 |V| 次,那么不就求出所由點對的最短路徑了嗎?時間復雜度為O(N3)。

不過,Dijkstra算法為我們提供了一種動態規劃的思想,一個點到另外一個點的最短路徑,要么直接到達就是最短的,要么就是經過了一個已經最優化的點間接到達這個點就是最短的,只有這么兩種情況。Floyd算法就根據這個思路把所有情況同過DP表的方式計算出來,時間復雜度是一樣的,也是O(N3),不過Floyd算法簡潔的多。

Floyd算法DP公式:

D0[V][W]=min{D?1[V][W],D?1[V][K]+D?1[K][W]}

D是一個二維矩陣,是一個輔助矩陣,初始狀態和graph是一致的,通過該矩陣的變化,我們來修正path矩陣的值即可。

更多的關于Floyd算法的解釋參見: 數據結構之最短路徑(Floyd) ,包括我下面用的打印函數,可以參見它的解釋。不過它的打印函數對于非強連通圖有一點問題,我加以修正了。

打印函數實際上意思就是,比如我要找(0, 8)的最短路徑,如果path[0][8]的值為k,說明0->8之間經過路徑k,且0->k的結果是最優的,所以目前找到了所求路徑的一部分{0, k1}。然后我們再次查找(k, 8)的最短路徑,看它們兩之間有沒有中間更優化的路徑,比如找到,如果有,那就找到了路徑{0, k1, k2},依次下去,知道path[k][8]的結果為8,說明沒有了??偟穆窂骄褪莧0, k1, k2 … 8}。

下面給出我的代碼:

#include <iostream>#include <vector>#include <iomanip>#include <limits.h>const int NUM_VERTICES = 5; //A B C D Evoid print_solution(std::vector<std::vector<int>>& helper, std::vector<std::vector<int>>& path){ for(int i=0; i<NUM_VERTICES; ++i){ for(int j=i+1; j<NUM_VERTICES; ++j){ if(helper[i][j] == INT_MAX) continue; std::cout<<i<<"->"; int k = path[i][j]; while(k != j){ std::cout<<k<<"->"; k = path[k][j]; } std::cout<<j<<std::endl; } }}void floyd(std::vector<std::vector<int>>& graph){ std::vector<std::vector<int>> helper(NUM_VERTICES, std::vector<int>(NUM_VERTICES)), path(NUM_VERTICES, std::vector<int>(NUM_VERTICES)); for(int i=0; i<NUM_VERTICES; ++i){ for(int j=0; j<NUM_VERTICES; ++j){ helper[i][j] = graph[i][j] == 0 ? INT_MAX : graph[i][j]; path[i][j] = j; } } for(int k=0; k<NUM_VERTICES; ++k){ for(int i=0; i<NUM_VERTICES; ++i){ for(int j=0; j<NUM_VERTICES; ++j){ if(helper[i][k] != INT_MAX && helper[k][j] != INT_MAX && helper[i][j] > helper[i][k] + helper[k][j]){ helper[i][j] = helper[i][k] + helper[k][j]; path[i][j] = k; } } } } print_solution(helper, path);}int main(){ std::vector<std::vector<int>> graph = {{0, 10, 0, 30, 100}, //A {0, 0, 50, 0, 0 }, //B {0, 0, 0, 0, 10 }, //C {0, 0, 20, 0, 60 }, //D {0, 0, 0, 0, 0 }};//E // A B C D E floyd(graph); //param 0 means vertex 'A' return 0;}

輸出結果: 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人综合精品在线| 国产视频久久久久久久| 国产日韩欧美电影在线观看| 18久久久久久| 热re91久久精品国99热蜜臀| 5566日本婷婷色中文字幕97| 亚洲美女性视频| 亚洲女人初尝黑人巨大| 日韩精品在线视频观看| 欧美日韩在线免费观看| 亚洲国产古装精品网站| 国产99久久精品一区二区 夜夜躁日日躁| 美女性感视频久久久| 91久久精品美女| 国产欧美日韩中文字幕在线| 成人h片在线播放免费网站| 久久精品最新地址| 欧美大片在线看| 成人久久一区二区三区| 欧美激情欧美激情在线五月| 色综合91久久精品中文字幕| 久久精品国产v日韩v亚洲| 91免费精品国偷自产在线| www国产精品视频| 在线激情影院一区| 一区国产精品视频| 九色精品美女在线| 中文字幕日韩免费视频| 最近2019年好看中文字幕视频| 国产欧美一区二区| 亚洲欧美日本另类| 国产精品对白刺激| 97视频在线免费观看| 欧美激情极品视频| 中文字幕日本欧美| 一区二区欧美日韩视频| 国产精品扒开腿做爽爽爽男男| 亚洲精品福利在线观看| 最新亚洲国产精品| 91最新国产视频| 日韩精品在线免费观看视频| 成人亚洲激情网| 国产精品久久久久久久久免费| 亚洲激情免费观看| 亚洲一区二区少妇| 精品久久久久久中文字幕大豆网| 91网站在线免费观看| 欧美交受高潮1| 少妇高潮久久久久久潘金莲| 国产精品第100页| 国产专区精品视频| 欧美日韩国产激情| 国产精品成人在线| 亚洲人av在线影院| 久久久免费av| 国产91精品久久久久久| 日韩中文视频免费在线观看| 久久大大胆人体| 亚洲视频自拍偷拍| 欧美在线视频免费| 国产日产久久高清欧美一区| 国产精品久久久久999| 亚洲精品国精品久久99热| 国产一区二区三区四区福利| 综合久久五月天| 亚洲欧美日韩一区二区在线| 日韩在线视频观看正片免费网站| 国产精品一区二区三区毛片淫片| 欧美在线中文字幕| 日韩中文字幕在线视频播放| 久久久亚洲国产天美传媒修理工| 亚洲在线视频福利| 欧美精品免费播放| 国产日韩欧美在线播放| 日韩免费观看av| 国产成人aa精品一区在线播放| 78m国产成人精品视频| 97在线看免费观看视频在线观看| 国产精品色午夜在线观看| 欧美黑人性猛交| 九九九久久国产免费| 亚洲国产精品字幕| 中文字幕亚洲综合久久筱田步美| 色先锋资源久久综合5566| 7777精品视频| 韩国19禁主播vip福利视频| 久久免费精品视频| 亚洲色图第一页| 少妇高潮久久久久久潘金莲| 日韩免费高清在线观看| www国产亚洲精品久久网站| 亚洲自拍偷拍福利| 国产一区二区欧美日韩| 亚洲黄色片网站| 成人伊人精品色xxxx视频| 一区二区三区视频免费在线观看| 91精品在线观| 亚洲人成电影网站色…| 日韩欧亚中文在线| 久久亚洲国产成人| 色播久久人人爽人人爽人人片视av| 国产精品女人网站| 国产精品自产拍高潮在线观看| 夜夜嗨av色综合久久久综合网| 国产在线视频2019最新视频| 欧美裸体xxxx| 狠狠色狠色综合曰曰| 日韩av在线资源| 久久欧美在线电影| 久久九九亚洲综合| 亚洲加勒比久久88色综合| 久久久久久国产精品久久| 国产欧美日韩亚洲精品| 日韩激情视频在线| 久久久视频免费观看| 成人精品视频99在线观看免费| 韩剧1988在线观看免费完整版| 欧美影院久久久| 国产成人啪精品视频免费网| 亚洲区在线播放| 91最新在线免费观看| 国产精品极品美女在线观看免费| 国产精品高清网站| 欧美性在线观看| 亚洲欧美激情一区| 国产丝袜高跟一区| 法国裸体一区二区| 亚洲欧美日韩网| 午夜精品一区二区三区在线| 国产日韩欧美夫妻视频在线观看| 国产一区私人高清影院| 成年无码av片在线| 91精品国产综合久久久久久蜜臀| 国产精品三级美女白浆呻吟| 日韩大片在线观看视频| 中文字幕亚洲色图| 青草青草久热精品视频在线网站| 日本一区二区三区在线播放| 国产婷婷成人久久av免费高清| 欧美精品在线观看| 国产成人极品视频| 欧美日韩一区二区三区| 成人免费高清完整版在线观看| 亚洲精品一二区| 一本色道久久综合亚洲精品小说| 亚洲色图50p| 日韩av影视综合网| 成人国产在线激情| 欧美大肥婆大肥bbbbb| 91在线观看免费高清| 国产suv精品一区二区三区88区| 国产成人亚洲精品| 欧美极品少妇xxxxⅹ喷水| 久久人人爽人人爽爽久久| 欧美性猛交xxxx免费看漫画| 成人国产精品免费视频| 成人黄色在线播放| 一本色道久久88精品综合| 成人在线观看视频网站| 国产欧美一区二区三区四区| 久久青草精品视频免费观看| 自拍偷拍免费精品| 亚洲xxxxx电影| 亚洲va久久久噜噜噜久久天堂|