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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构之图的应用:最短路径(Dijkstra、Floyd)

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之图的应用:最短路径(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:

1、先初始化一個空結果集 2、讓某一節點進入結果集 3、從非結果集中的頂點中選出一條最小權重的邊,并將該邊的另一個頂點加入結果集 4、從結果集的頂點出發到新加入的頂點的路徑不止一條,要從多條路徑中選出最短的一條,并修改對應數組值 5、重復3、4操作直到所有的頂點都加入到結果集中

要是實在看不懂,下面有具體實例講解

算法實現中的輔助數組:


算法實現中用到的輔助數組:

1、s[]數組:標記已經加入了結果集的頂點 2、dist[]數組:從一個v0(某一個確定的節點)出發到各個節點的最短路徑,若有多條路徑選擇最短的一條記錄 3、path[]數組:記錄到達該節點的前驅節點的數組下標,A->B->C,到達C的前驅節點為B

例:

這是重點,幫助理解;這是重點,幫助理解

后續的思路與上述相同,就不再贅述。

如何通過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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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