数据结构之图的应用:最短路径(Dijkstra、Floyd)
生活随笔
收集整理的這篇文章主要介紹了
数据结构之图的应用:最短路径(Dijkstra、Floyd)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖的應用:最短路徑
- 思維導圖:
- 最短路徑的定義:
- BFS算法:(無權單源最短路徑)
- Dijkstra算法:(無權單源、帶權單源)
- Dijkstra算法原理:
- 算法實現中的輔助數組:
- 例:
- 如何通過path[]數組找到0到其他頂點的路徑?
- Dijkstra算法的代碼實現:
- Dijkstra算法適用范圍及性能:
- Floyd算法:
- Floyd算法原理:(動態規劃)
- 例:
- Floyd算法的代碼實現:
- 性能分析:
- 例:
- 缺點:
- 三種算法的對比:
思維導圖:
最短路徑的定義:
BFS算法:(無權單源最短路徑)
void BFS_Distance(Graph G,int v){for(int i=0;i<G.vexnum;++i)d[i] = MAX;visited[v] = true;d[v] = 0;EnQueue(Q,v);while(!isEmpty(Q)){ //不空還有未遍歷到的節點 DeQueue(Q,v); //出隊v for(w = FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)) //找到所有符合條件的鄰接節點 if(!visited[w]){ //w是否被訪問 visited[w] = true; //修改該頂點對應數組的值為trued[w] = d[v] + 1;EnQueue(Q,w); //入隊 }} }Dijkstra算法:(無權單源、帶權單源)
后續補充:至原理之前
Dijkstra算法原理:
注: 此算法只解決單源問題,即從一個確定頂點到其他所有頂點的路徑問題
ps:
要是實在看不懂,下面有具體實例講解
算法實現中的輔助數組:
算法實現中用到的輔助數組:
例:
這是重點,幫助理解;這是重點,幫助理解
后續的思路與上述相同,就不再贅述。
如何通過path[]數組找到0到其他頂點的路徑?
ps:
因為path[4] = 2,即4的前驅是2
又path[2] = 0,即2的前驅又是0
又path[0] = -1,即0就是序列頭節點
所有得到了序列0—>2—>4
其他原理類似,不在贅述
Dijkstra算法的代碼實現:
void Dijkstra(Graph G,int v){ //圖和源點 //初始化三個數組 int s[G.vexnum];int path[G.vexnum];int dist[G.vexnum];for(int i=0;i<G.vexnum;i++){ dist[i] = G.edge[v][i];s[i] = 0;if(G.edge[v][i] < MAX)path[i] = v;elsepath[i] = -1;} s[v] = 1;path[v] = -1;//尋找dist[]數組最小值 for(i=0;i<G.vexnum;i++){int min = MAX;int u;for(int j=0;j<G.vexnum;j++)if(s[j]==0 && dist[j]<min){min = dist[j];u = j;}s[u] = 1; //將u加入結果集 //加入了新的節點,更新數組 for(int j=0;j<G.vexnum;j++)if(s[j]==0 && dist[u]+G.Edge[u][j] < dist[j]){dist[j] = dist[u]+G.Edge[u][j];path[j] = u;}} }Dijkstra算法適用范圍及性能:
時間復雜度:O(|V|2)
存在負權值的圖無法用Dijkstra算法
Floyd算法:
后期補充:至算法原理之前
Floyd算法原理:(動態規劃)
A(0)矩陣表示加入0節點后的矩陣
A(1)矩陣表示加入節點1后的矩陣
ps:
在原來的結果集中加入一個節點k
節點i到節點k原有路徑 與 經過k的路徑比較
選最短的一條
例:
Floyd算法的代碼實現:
void Floyd(Graph G){int A[G.vexnum][G.vexnum];//初始化for(int i=0;i<G.vexnum;i++)for(intj=0;j<G.vexnum;j++)A[i][j] = G.Edge[i][j];//對每一個值進行修改for(int k=0;k<G.vexnum;k++) //考慮以Vk作為中轉點//修改某個值for(int i=0;i<G.vexnum;i++) //遍歷矩陣i為行號,j為列號for(intj=0;j<G.vexnum;j++)if(A[i][j] > A[i][k] + a[k][j]) //判斷路徑是否最優A[i][j] = A[i][k] + a[k][j]; //更新最短路徑長度//path[i][j] = k; }性能分析:
時間復雜度:O(|V|^3)
空間復雜度:O(|V|^2)
例:
缺點:
三種算法的對比:
總結
以上是生活随笔為你收集整理的数据结构之图的应用:最短路径(Dijkstra、Floyd)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于UIView
- 下一篇: Swift - 类型属性(类静态属性)和