[C] Dijkstra算法——通过边实现松弛
生活随笔
收集整理的這篇文章主要介紹了
[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算法——通过边实现松弛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 传单多少钱啊?
- 下一篇: [C] Bellman-Ford边松弛: