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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Dijkstra 最短路径算法详解 无向图

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

對于最短路徑問題,這里介紹一種O(N^2)的求解方法。?
?
對于求最短路徑的問題一般都會給出一幅圖,或者邊與邊的關系。如上圖。

假設我們起點是A,我們要求到F的最短距離,我們會怎么做??
首先,因為A是起點,所以我們把對于每個點都有個參數,相對于A的距離,默認除了A到A為0,其他都是無窮大。?

從起點A開始,我們更新與A相連通的點到A的距離,并把A點標記。如圖:?

我們遍歷一次所有點與A的距離,找到最小的,這里是點B。?
以它為起點,把它周圍未被標記的點拿來做比較,顯然,像F這種沒有與A練過的點,當前距離就會變成min(dis[B]+maze[B][F],INF),就是B到起點的距離加上BF之間的距離。而像c這種與A直接相連的點,當前距離就會變成min(dis[B]+maze[B][C],dis[c]),所以按照我們每次只需要比較當前點到當前狀態起點的和與當前點到起點的距離就可以了。?

然后我們遍歷發現,當前未被標記且到起點距離最小點的點是C點。我們更新連接了C的所有點。同樣利用上面的min公式。?

同理,更新D點的鄰點。?

再把更新E點的鄰點。?

最后再更新F點。發現F點周圍所有點都被標記了,不做更新。?
再遍歷,發現圖中所有點都被遍歷了,算法結束。?
這個時候,我們已經求出了所有點到起點的最小距離。?
可以直接輸出dis[F]求得A到F的最短路徑。

注意:?
上面的圖重點是看每次變化找的起點和與出發點路徑的變化。?
當前起點是當前未被標記且到出發點距離最近的點。?
更新的點都是與該起點直接相連并未被標記的點。

因為并沒有無窮大這個數,所以我們把INF設為一個我們計算不能到達的數,這里的數接近int的上限,可以近似看作正無窮。

參考代碼如下:

#include"iostream" #include"cstring" #include"cstdio"using namespace std; #define INF 0x7f7f7f7fconst int N = 105; //點的個數上限int maze[N][N]; int dis[N]; bool vis[N];//點的個數和邊的條數 int n,m;void init() {memset(maze,INF,sizeof(maze));memset(dis,INF,sizeof(dis));memset(vis,false,sizeof(vis)); }void dijkstra(int st) {dis[st]=0;for(int i=1; i<=n; i++){//找到和起點距離最短的點int minx=INF;int minmark;for(int j=1; j<=n; j++){if(vis[j]==false&&dis[j]<=minx){minx=dis[j];minmark=j;}}//并標記vis[minmark]=true;//更新所有和它連接的點的距離for(int j=1; j<=n; j++){if(vis[j]==false&&dis[j]>dis[minmark]+maze[minmark][j])dis[j]=dis[minmark]+maze[minmark][j];}} }int main() {while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0) break;//每組數據都要初始化init();for(int i=1; i<=m; i++){int x,y,len;scanf("%d %d %d",&x,&y,&len);if(x!=y&&maze[x][y]>len){maze[y][x]=len;maze[x][y]=len;}}//以1為起點跑一次dijdijkstra(1);//輸出到n的距離printf("%d\n",dis[n]);} }
與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

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

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