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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[C] Dijkstra算法——通过边实现松弛

發布時間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C] Dijkstra算法——通过边实现松弛 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Dijkstra算法——通過邊實現松弛

  • 本算法學習指定一個點(源點)到其余各個頂點的最短路徑,也叫做單源最短路徑例如求下圖1號頂點到2,3,4,5,6號頂點的最短路徑
  • 這個時候你可能就要問了,為什么不可以直接用上一篇 只有5行的算法:Floyd-Warshall 的方法把所有的最短路都求出來,然后取一行就行了呢?
  • Floyd-Warshall算法的時間復雜度是O(N^3),而本文要介紹的Dijkstra算法時間復雜度是O(N^2),而且會在后續的里介紹優化本算法的方式。當數據過大時,Floyd-Warshall就不能再規定時間內完成了。
  • 與Floyd-Warshall算法一樣,邊的存儲方式是二維數組。
  • 這里還需要一個dis數組,來記錄1號頂點到每個頂點的距離(長度為n)、
  • 與BFS不同(雖然這個算法和bfs沒啥太大聯系),這個dis數組無需頭指針尾指針。
  • 當然,book數組是不可缺少的。(這就導致了空間復雜度翻倍)

代碼實現

#include<stdio.h>
int a[2000][2000];
int inf = 99999999;
int dis[2000], book[2000];
int main()
{int i, j, k, m, n, x, y, s, u, v;int min;scanf("%d %d", &n, &m);/* *///初始化for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)if (i == j)a[i][j] = 0;elsea[i][j] = inf;//讀入邊(有向圖)for (i = 1; i <= m; i++){scanf("%d %d %d", &x, &y, &s);a[x][y] = s;}for (i = 1; i <= n; i++)dis[i] = a[1][i];for (i = 1; i <= n; i++)book[i] = 0;book[1] = 1;//Dijkstra 算法核心語句for (i = 1; i <= n; i++){//找到離1號頂點最近的點min = inf;for (j = 1; j <= n; j++){if (book[j] == 0 && dis[j] < min){min = dis[j];u = j;}}book[u] = 1;for (v = 1; v <= n; v++){if (a[u][v] < inf){if (dis[v] > dis[u] + a[u][v]){dis[v] = dis[u] + a[u][v];}}}}for (i = 1; i <= n; i++){printf("%d ", dis[i]);}return 0;
}

運行結果:

總結

以上是生活随笔為你收集整理的[C] Dijkstra算法——通过边实现松弛的全部內容,希望文章能夠幫你解決所遇到的問題。

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