最短路演算法1(Dijkstra演算法)

2021-10-23 23:01:40 字數 2575 閱讀 6188

一.迪傑斯特拉演算法原理

運用貪心的思想來處理最短路問題,先從起點開始,遍歷與起點有相連的邊,然後更新相連點的權值(標記起點),再從與起點相連邊中權值最小的點為新起點(就是這裡用了貪心,該起點應沒被標記過)重複以上操作n -1 次(看不懂很正常,看下下面的例子就大概懂了)。

二.關於迪傑斯特拉演算法時間複雜度

本蒟蒻寫的最樸素的版本沒用優化 ,時間複雜度為o( v * e),據說是可以用堆優化。

三.舉個栗子

我們要從城市a到城市d(共4個點 n = 4). 有4 條路徑如下,問怎麼走時間最短?

起 終 time

a - > b 1

b - > c 1

c - > d 1

a - > d 5

1.設定距離陣列d[5],用於存放起點掉該編號點的最小距離,先初始化該陣列的值為無窮大(inf)因為初始時到不了 ,然後把起點的d[a] 的距離變為0自己到自己不就0嗎 再設定乙個標記陣列f[5] 初始化其成員值為0(表示沒來過)

2. 我們先從起點(來到起點了 ,f[1] =0 標記一下)開始處理, 找a 能直接到的點,並更新到該點的最小時間再標記該點。

d[5] = 0 0 1 inf 5

f[5] =0 1 0 0 0

ps:城市下標從1開始,而陣列下標是從0 開始的

3.從距離陣列中找到距離最小且沒有被標記的那個點為新起點,重複 2 操作n - 2次·

重複第1次

d[5] = 0 0 1 2 5

f[5] =0 1 1 0 0

重複第2次

d[5] =0 0 1 2 3

f[5] =0 0 1 1 0

起始條件:給定起點o,終點p,以及各個邊,邊用鄰接矩陣存。

剛開始假設從起點 o 到起點 o 的距離為0,到其他節點的距離為inf(無窮大),先從起點o遍歷一遍即設定距離陣列的d[maxn], d[o] = 0, 其他陣列元素的值為inf(無窮大)

memset

(d, inf,

sizeof

(d))

; d[1]

=0;//1為起點

f[1]

=1;//標記起點, 放入走過的集合(不走第2次)

for(

int i =

1; i <= n;

++i)

1.遍歷一遍距離陣列d[maxn],找到最小權值的下標,並進行標記,防止這個點處理兩次。

int temp =

0, minn = inf;

//temp記錄d陣列中最小距離的下標,minn記錄最小權值

for(

int j =

1; j <= n -2;

++j)

} f[temp]=1

;//進行標記

2.從起點 o 開始(標記起點 o ),找與相連的點,進行邊的 」 鬆弛「 操作(即更新這點的權值, 變得更小 )。

for

(int j =

1; j <= n;

++j)

}

3.重複1,2步驟n - 2次

for

(int i =

1; i < n;

++i)

} f[temp]=1

;//步驟 2

for(

int j =

1; j <= n;

++j)

}}

例題(模板題)

實驗室有很多台計算機,由於每個人計算機的效能不同,導致計算機之間傳送資訊的速度不同,所以花費時間不同。

訊息從第一台電腦傳送到第二台電腦後,這兩台電腦能再向其他電腦傳送訊息,就是一種類似二叉樹的結構。

當然並不是真正的二叉樹——我們的計算機有一些特殊的特性,我們應該加以利用。

我們的計算機允許同時向連線到它的任意數量的其他計算機傳送訊息。

然而,訊息不一定同時到達目的地——這涉及到計算機配置。

一般來說,我們需要考慮到拓撲結構中每個計算機的時間成本,並相應地計畫將訊息傳播所需的總時間降到最低。

塗爺需要經常給其他人發訊息,她想要知道如果她發出乙個訊息,至少要等多久全部的人才可以都收到通知。

input

第一行輸入乙個n,表示有多少臺計算機(塗爺當然是一號機啦~)。

隨後n-1行,以鄰接矩陣的形式給出計算機(1~n)之間通訊需要的時間。

由於兩台計算機相互通訊時間相等,且計算機自己和自己不需要通訊,所以只給出了矩陣的下三角。ps:x表示由於部分計算機之間存在特殊的磁場並不能通訊。ps2:該題所有資料範圍0~100。

output

輸出一行表示塗爺需要等待的時間。

sample input550

30 5

100 20 50

10 x x 10

sample output

35解題方法: 輸入資料,設1為起點,n為終點,跑一遍dijkstra , 然後輸出。

應用不僅可以計算兩點之間的最短路,還能計算從起點出發到每個點的最短路,即單源最短路。

最短路徑1 Dijkstra演算法

1 設定乙個集合s存放已經找到最短路徑的頂點,s的初始狀態只包含源點v,對vi v s 2 假設從源點v到vi的有向邊為最短路徑,以後每求得一條最短路徑v,vk,就將vk加入集合s中,並將路徑v,vk vi與原來的假設相比較,取路徑長度較小者為最短路徑 3 重複上述過程,直到集合v中全部頂點加入到集...

最短路 Floyd演算法和Dijkstra演算法

兩者在負權問題上不是很好,最好只處理正值,dijkstra演算法對負權毫無辦法,但是floyd演算法不能處理出現負環的東西。dijkstra演算法的話,為了方便,我認為從i到i點不可達 百部百科解釋挺好,那個堆優化挺好的 floyd演算法百部百科也不錯,都是老演算法了,哪都有資料 這位筒子的寫得很好...

ACM之路 5 最短路演算法 Dijkstra演算法

簡介 dijkstra演算法是一種單源路徑演算法。時間複雜度為 o n 2 比floyd演算法 o n 3 快很多。當然,dijkstra演算法可以用堆優化後,演算法複雜度成了 o m n logn 複雜度更底了。本文只講解dijkstra的簡單演算法。問題 給予n個城市和m條道路,求從城市1到城市...