演算法實踐2 2 Dijkstra

2022-07-12 05:39:10 字數 1427 閱讀 5538

對於下圖使用\(dijkstra\)演算法求由頂點\(a\)到頂點\(h\)的最短路徑,按實驗報告模板編寫演算法。

我們從乙個源點\(s\)出發,要找它到點\(t\)的最短距離,可以考慮將和源點相鄰的點都放到我們的乙個決策集合裡。然後我們每次貪心地拿出到距離點\(s\)距離最近的點\(u\),然後遍歷跟點\(u\)相鄰的點\(v\),如果原先點\(v\)到點\(s\)的距離大於點\(u\)到點\(s\)的距離加上點\(u\)到點\(v\)的距離,那麼我們就可以更新點\(v\)到點\(s\)的距離,同時也把點\(v\)加入我們的決策集合裡,待到下一次選擇點時,也將其納入考慮的範圍。當我們在決策集合中選擇到點\(t\)時結束。

void dijkstra(int s, int t) }}

}

需要遍歷所有邊,時間複雜度為\(o(e)\)。再加上用堆優化我們的決策集合,維護決策集合的時間複雜度為\(o(logn)\)。維護決策集合需要在遍歷邊的裡面完成,所以總時間複雜度為\(o(elogn)\)。

實驗2-2 dijkstra

#include using namespace std;

const int inf = 0x3f3f3f3f;

const int n = 1e2 + 7;

struct edge

edge (int nxt, int v, int w) : nxt(nxt), v(v), w(w) {}

}edge[(n * n + n) << 1];

struct qnode

qnode () {}

qnode (int u, int w) : u(u), w(w) {}

};int dis[n], head[n], vis[n];

int n, m, u, v, w, tot, s, t;

void addedge(int u, int v, int w)

void dijkstra(int s, int t) }}

}int main()

getchar();

scanf("%c %c", &s, &t);

s -= 'a';

t -= 'a';

dijkstra(s, t);

printf("%d\n", dis[t]);

return 0;}/*

8 11

a b 1

b d 2

c a 2

d c 1

d f 8

e d 2

e g 2

f e 2

g f 3

g h 3

h f 2

a h*/

演算法分析與設計2 2Dijkstra演算法

對於下圖使用dijkstra演算法求由頂點a到頂點h的最短路徑 1 將圖中的a,b,h與1,2 8相對應,便於編寫 2 將起點到所有點的距離儲存在一維陣列中,並找出其中距離最近的點 3 將 2 中找到的點作為中間點,判斷距離是否會會更近,若更近則更新距離 4 重複 2 3 void dijkstra...

實驗2 2 單源最短路演算法Dijkstra

如果從圖中某一頂點到達另一頂點的路徑可能不止一條,如何找到一條路徑使得沿此路徑上各邊的權值總和 稱為路徑長度 達到最小。可以將適用最短路的演算法分為單源最短路和多源最短路。單源最短路演算法dijkstra 對於下圖使用dijkstra演算法求由頂點a到頂點h的最短路徑 每次找到離源點最近的乙個頂點,...

演算法 Dijkstra演算法筆記

參考文章 隨記參考邏輯 dijkstra演算法採用的是一種貪心的策略。演算法的基本思想是 通過不斷更新的距離陣列,每次從距離陣列找到離源點最近的乙個且沒有掃瞄過的節點,然後以該頂點為中心進行bfs擴充套件,直到所有節點都掃瞄一遍,最終得到源點到其餘所有點的最短路徑 1 起點固定,若要記錄到達路徑,則...