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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

图-最短路径

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图-最短路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ??最短路徑:對于網圖來說,最短路徑是指兩個頂點之間經過的邊上權值之和最少的路徑,并且我們稱路徑上的第一個頂點式源點,最后一個頂點是終點。以下圖為例,

? ???尋找v0到v8的最短距離。

?

? ?對應解決思路:現在比較成熟的有Dijkstra(迪杰斯特拉)算法和Flord算法算法。

??Dijkstra(迪杰斯特拉)算法

? ? ?Dijkstra求源節點S到終結點D的最短距離的過程中,循環過程中每次確定一個源節點到其它節點T的最短距離。該距離確定后,遍歷判斷該節點T到其它節點的距離是否比現在S到其它節點距離短,更短的話則修改為相應長度,并將對應的路徑記錄。。這種求最短路徑的方式與圖最小生成樹算法之Kruskal(克魯斯卡爾)算法有異曲同工之妙。該算法的時間復雜度度是O(N^2),N是節點的個數。

? ?代碼如下:

int dist[MAXNUM]; int prevT[MAXNUM]; int final[MAXNUM]; int MIN;

int G[9][9]={0,1, 5, MAXINT ,MAXINT, MAXINT, MAXINT, MAXINT, MAXINT,//對應的權值矩陣 1, 0, 3, 7, 5, MAXINT ,MAXINT, MAXINT ,MAXINT, 5 ,3, 0, MAXINT ,1 ,7, MAXINT ,MAXINT ,MAXINT, MAXINT, 7, MAXINT ,0, 2, MAXINT, 3 ,MAXINT, MAXINT, MAXINT ,5, 1, 2, 0, 3 ,6, 9, MAXINT, MAXINT, MAXINT ,7, MAXINT, 3, 0, MAXINT, 5, MAXINT, MAXINT ,MAXINT ,MAXINT, 3, 6, MAXINT, 0 ,2 ,7, MAXINT, MAXINT ,MAXINT, MAXINT, 9 ,5 ,2, 0, 4, MAXINT, MAXINT ,MAXINT, MAXINT, MAXINT, MAXINT ,7, 4, 0}; void Short_Dijkstra() {//初始化dist和prevTint min_num;for(int i=0;i<MAXNUM;i++){final[i]=0;//標記是否是最短路徑dist[i]=G[0][i];//對應權值prevT[i]=0;}final[0]=1;//對v0本身就是最短的dist[0]=G[0][0];for(int i=1;i<MAXNUM;i++)//每次遍歷v0到某個頂點最短距離 {MIN=MAXINT;//最小值min_num=0;for(int j=1;j<MAXNUM;j++){if(!final[j] && dist[j]<MIN){min_num=j;MIN=dist[j];//最小值 }}final[min_num]=1;//找到最小值for(int k=0;k<MAXNUM;k++){if(!final[k] && (G[min_num][k]+dist[min_num]<dist[k])) //在已有的點上找到距離V0更短的距離 {prevT[k]=min_num;//記錄經過的前驅點dist[k]=G[min_num][k]+dist[min_num];//更新距離 }}} }

Flord算法

? ??Floyd算法是一個經典的動態規劃算法,它適用于尋找各個頂點之間的最短距離。從任意節點i到任意節點j的最短路徑不外乎2種可能,1是直接從點i到點j,這種方法最直接,但是距離比一定最短。2是從i經過若干個節點k到j。所以,我們假設Dis(i,j)為節點i到節點j的最短路徑的距離,對于每一個節點k,我們檢查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,證明從i到k再到j的路徑比i直接到j的路徑短,我們便設置Dis(i,j) = Dis(i,k) + Dis(k,j),同時記錄我們走過的路徑。這樣一來,當我們遍歷完所有節點k,Dis(i,j)中記錄的便是i到j的最短路徑的距離。算法時間復雜度:O(n3)。

? 代碼如下

? ?

void Short_Dijkstra() {//初始化dist和prevTTint min_num;for(int i=0;i<MAXNUM;i++){final[i]=0;dist[i]=G[0][i];prevT[i]=0;}final[0]=1;//對v0本身就是最短的dist[0]=G[0][0];for(int i=1;i<MAXNUM;i++)//每次遍歷v0到某個頂點最短距離 {MIN=MAXINT;//最小值min_num=0;for(int j=1;j<MAXNUM;j++){if(!final[j] && dist[j]<MIN){min_num=j;MIN=dist[j];//最小值 }}final[min_num]=1;//找到最小值for(int k=0;k<MAXNUM;k++){if(!final[k] && (G[min_num][k]+dist[min_num]<dist[k])) //在已有的點上找到距離V0更短的距離 {prevT[k]=min_num;//記錄經過的前驅點dist[k]=G[min_num][k]+dist[min_num];//更新距離 }}} }

? 圖這兩種算法最核心的思想就是:利用已有的最短的距離路徑,通過這路徑來不斷擴充,最終實現從原點S到終點D的尋找過程。

? ?

轉載于:https://www.cnblogs.com/zhanjxcom/p/5665879.html

總結

以上是生活随笔為你收集整理的图-最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。

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