演算法學習整理 一 Dijkstra

2021-10-03 10:05:51 字數 1448 閱讀 3855

假設構建的是一副無向圖

圖中有0~6 7個點,每段線表示從乙個點到另乙個點的值

dijkstra演算法的目的是找到乙個點到另乙個點的最短路徑

假設已經構建好了圖的關係,並選取了起始點a1

思路:初始化兩個點集合s和u,s包括起點a1,u包括剩餘點,遍歷計算s中點到u中點的最短距離,不相鄰/連線的距離為∞;

上一步計算得到u集中所有點的距離,從u中選出最短距離點k,從u集中移動到s集中;

重複上述1和2的步驟,至u為空。

我們假設輸入為 n 個點,並輸入m個關係,先假設每個關係之間無向,然後連續輸入m個點的關係。最後輸入乙個點,求出到其他點的具體距離。

輸入樣例

7 12

0 1 12

0 5 16

0 6 14

1 2 10

1 5 7

2 3 3

2 4 5

2 5 6

3 4 4

4 5 2

4 6 8

5 6 1000

0

#include

#include

#include

using

namespace std;

intmain()

cin >> s;

vector<

int>

dis(n,

1000000);

deque<

int> u;

deque<

int> end;

end.

push_back

(s);

dis[s]=0

;for

(int i =

0; i < n; i++

)while

(u.size()

>0)

}}}int min_dis =

1000000

;int index =0;

// 找最小的下標

for(

int i =

0; i < u.

size()

; i++)}

end.

push_back

(u[index]);

u.erase

(u.begin()

+ index);}

for(

int i =

0; i < dis.

size()

; i++)}

return0;

}

輸出

Dijkstra演算法學習

dijkstra演算法是求解有向圖最短路徑的經典演算法,計算從乙個指定的初始結點到其他各個結點最短路徑。它的理論基礎就是一條最短路徑的子路徑也一定是最短的。實現如下 將所有結點分為兩個集合,乙個命名為s集,乙個命名為u集。s集中的點是我們已知其最短路徑的點,u集中的點是我們還未知其最短路徑的點。因此...

Dijkstra演算法 學習筆記

dijkstra演算法用於求最短路徑,原理的話可以去網上搜搜,有一些講得還是比較清楚的。筆者是在學opencv的時候接觸到的,不過 寫出來似乎跟c 關係比較大,無妨,會用就好。感謝轉 最短路徑 dijkstra演算法和floyd演算法 和原 dijkstra演算法 matlab 這兩篇博文的作者。本...

dijkstra演算法學習筆記

dijkstra是一種單源最短路徑演算法,即求乙個點到其他點的最短路。不能處理負邊權。最近某種廣為人知的演算法頻繁被卡,讓dijkstra逐漸成為了主流,甚至在初賽中鞭屍了spfa dijkstra效率還是不錯的,而且不容易被卡。用dis陣列儲存最短路徑。初始化時,dis s 設定為0 s為起點 其...