Dijkstra演算法(一)

2022-04-08 02:08:30 字數 3539 閱讀 6373

由於準備美賽,所以提前看一下相關書籍。

參考:資料建模演算法與應用(第二版),

dijkstra演算法是典型最短路演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。

dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。

dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用open, close表方式,drew為了和下面要介紹的 a* 演算法和 d* 演算法表述一致,這裡均採用open,close表的方式。

其採用的是貪心法的演算法策略

建立兩個表,open, close。

open表儲存所有已生成而未考察的節點,closed表中記錄已訪問過的節點。

1. 訪問路網中距離起始點最近且沒有被檢查過的點,把這個點放入open組中等待檢查。

2. 從open表中找出距起始點最近的點,找出這個點的所有子節點,把這個點放到close表中。

3. 遍歷考察這個點的子節點。求出這些子節點距起始點的距離值,放子節點到open表中。

4. 重複第2和第3步,直到open表為空,或找到目標點。

具體以書中例子為例:

eg:某公司在6個城市c1,c2,c3,c4,c5中有分公司,從c1到cj的直接航程票價記在下屬鄰接矩陣中(空格代表無效)。尋找一條c1到其他城市的最便宜的路線。

變數解釋:index1,index2,index3分別用來存放標號資訊的,標號定點順序,標號頂點索引,從始點到終點(result)的通路。

index2存放起始點到第i點的最短通路的第i頂點前一頂點的序號。

例如上述示例,c1到c5的通路為1->3->5。

當然,在記錄路徑資訊的時候也可參照下面c++的方法把所有的最短通路的資訊都顯示出來(通過index2)。

c++:

#include#define maxnum 765432100

using

namespace

std;

ifstream fin(

"dijkstra.in.txt");

ofstream fout(

"dijkstra.out.txt");

int map[100][100

];bool is_arrived[100

];int dist[100], from[100], stack[100

];int

p, q, k, path, source, vertex, temp, setcard;

intfindmin()

return

temp;

}int

main()

for (p = 1; p <= vertex; p++)

is_arrived[source] = true

; setcard = 1

;

do }

else

break

; }

while (setcard !=vertex);

for (p = 1; p <= vertex; p++)

if (p !=source)

else

fout

<< "

path:

"<

for (q = k - 1; q >= 1; q--)

fout

<< "

-->

"<

}fout

<< "

\n********************====\n\n";

}fin.close();

fout.close();

return0;

}

結果:

********************====

source:1

target:2

distance:90

path:1-->3-->5-->2

********************====

********************====

source:1

target:3

distance:40

path:1-->3

********************====

********************====

source:1

target:4

distance:60

path:1-->3-->4

********************====

********************====

source:1

target:5

distance:70

path:1-->3-->5

********************====

lingo解法請見dijkstra 二。

演算法 Dijkstra演算法筆記

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

日日演算法 Dijkstra演算法

dijistra演算法作為一種最短路徑演算法,可以用來計算乙個節點到圖上其他節點的最短距離。主要是通過啟發式的思想,由中心節點層層向外拓展,直到找到中點。適用於無向圖和有向圖。假設我們要計算節點a到其它節點的最短距離 引入兩個集合 s,u 其中集合s表示已經求出最短路徑的點 以及最短距離 集合u表示...

演算法學習整理 一 Dijkstra

假設構建的是一副無向圖 圖中有0 6 7個點,每段線表示從乙個點到另乙個點的值 dijkstra演算法的目的是找到乙個點到另乙個點的最短路徑 假設已經構建好了圖的關係,並選取了起始點a1 思路 初始化兩個點集合s和u,s包括起點a1,u包括剩餘點,遍歷計算s中點到u中點的最短距離,不相鄰 連線的距離...