對於下圖使用\(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 起點固定,若要記錄到達路徑,則...