以a為起始點,計算出a到其他各頂點的最短路徑。
迪傑斯特拉演算法每一步都可以確定從a到其他某乙個點的最短路徑。
注意:下面a->f(6)(括號內的值表示權值,其他同理)
1、a的鄰接點之後f與b,則a->f(6)與a->b(3.5)放入待選邊集。
此時待選邊集有:a->f(6)、a->b(3.5) 。
此時確定最短路徑的頂點為:a ----一開始因為a到a自己本身權值為0,肯定是最短的。
然後a->b(3.5)就要從待選邊集中去掉,並且把b與b的鄰接點(c、d,而a作為起點,所以不要)之間的邊放入待選邊集。
由於起點到b點的最短距離是3.5,所以從b到其他鄰接點的距離都要加3.5。
2.此時的待選邊集為:a->f(6)、a->b->c(7.5=3.5+4)、a->b->d(7=3.5+3.5) ,
此時確定最短路徑的頂點為:a 、b。
(a->b->c可以寫為b->c,但為了表示方便,把起點到b的路徑也寫出來更好看,在**中只要設定b的上一頂點為a就行了)。
從待選邊集中選擇路徑最短的一條,就可以確定6<7<7.5,那麼a->f(6)就是此次當前步驟能確定的一條最短路徑(如果是在**中,直接設定f的上一頂點為a就行了)。
此時確定最短路徑的頂點為:a 、b、f,
然後a->f(6)就要從待選邊集中去掉,並且把f與f的鄰接點(g、d,而a作為起點,所以不要)之間的邊放入待選邊集,
由於起點到f點的最短距離是6,所以從f到其他鄰接點的距離都要加6。
3、此時的待選邊集為:a->b->c(7.5=3.5+4)、a->b->d(7=3.5+3.5) 、 a->f->g(7=6+1) 、 a->f->d(11=6+5) 。
此時確定最短路徑的頂點為:a 、b、f,
此時待選邊集中有兩條邊的起點與終點是一樣的(中間經過頂點可能不一樣),那麼可以精簡待選邊集,把路徑最短的留下,其他的從待選邊集中去除。當前a->b->d(7=3.5+3.5)與a->f->d(11=6+5)起點和終點相同,留下距離最短的a->b->d(7=3.5+3.5)。
此時的待選邊集為:a->b->c(7.5=3.5+4)、a->b->d(7=3.5+3.5) 、 a->f->g(7=6+1) 。
從待選邊集中選擇路徑最短的,就可以確定7=7<7.5,7最短,由於有兩個一樣的都是7,那麼隨便選乙個就行了,選哪個都不影響。
我選擇 a->f->g(7=6+1),這就是此次當前步驟能確定的一條最短路徑(如果是在**中,直接設定g的上一頂點為f就行了,因為f也設定了上一頂點,所以這樣就能連成一條路徑)。
此時確定最短路徑的頂點為:a 、b、f、g,
然後a->f->g(7=6+1)就要從待選邊集中去掉,由於g點除了f點就沒有其他鄰接點了,那麼就沒有要新增進待選邊集的邊。
繼續下一步
4、此時的待選邊集為:a->b->c(7.5=3.5+4)、a->b->d(7=3.5+3.5) 。
此時確定最短路徑的頂點為:a 、b、f、g,
從待選邊集中選擇路徑最短的,就可以確定7<7.5,那麼a->b->d(7=3.5+3.5) 就是此次當前步驟能確定的一條最短路徑(如果是在**中,直接設定d的上一頂點為b就行了,因為b也設定了上一頂點,所以這樣就能連成一條路徑)。
此時確定最短路徑的頂點為:a 、b、f、g、d
然後a->b->d(7=3.5+3.5) 就要從待選邊集中去掉,並且把d與d的鄰接點(e、c,而f和b點已經是確定了最短路徑的,所以不要)之間的邊放入待選邊集,
由於起點到d點的最短距離是7,所以從d到其他鄰接點的距離都要加7。
5、此時的待選邊集為:a->b->c(7.5=3.5+4)、a->b->d->e(10=7+3)、a->b->d ->c(9=7+2)。
此時需要精簡待選邊集(理由與第三步一樣,不再複述)
精簡後待選邊集:a->b->c(7.5=3.5+4)、a->b->d->e(10=7+3) ,
此時確定最短路徑的頂點為:a 、b、f、g、d 。
從待選邊集中選擇路徑最短的,就可以確定7.5<10,那麼a->b->c(7.5=3.5+4)就是此次當前步驟能確定的一條最短路徑(如果是在**中,直接設定c的上一頂點為b就行了,因為b也設定了上一頂點,所以這樣就能連成一條路徑)。
此時確定最短路徑的頂點為:a 、b、f、g、d 、c。
然後a->b->c(7.5=3.5+4) 就要從待選邊集中去掉,並且把c與c的鄰接點(e,而b和d點已經是確定了最短路徑的,所以不要)之間的邊放入待選邊集,
由於起點到c點的最短距離是7.5,所以從c到其他鄰接點的距離都要加7.5。
6、此時待選邊集:a->b->d->e(10=7+3) 、a->b->c->e(11.5=7.5+5)、
此時需要精簡待選邊集(理由與第三步一樣,不再複述)
精簡後待選邊集:a->b->d->e(10=7+3) .
從待選邊集中選擇路徑最短的,由於只剩下一條,那麼a->b->d->e(10=7+3)就是此次當前步驟能確定的一條最短路徑(如果是在**中,直接設定e的上一頂點為d就行了,因為d也設定了上一頂點,所以這樣就能連成一條路徑)。
此時確定最短路徑的頂點為:a 、b、f、g、d 、c、e 。到此可以知道,當前已經可以確定了起點到所有點最短路徑,演算法結束。。。
上面的演算法其實只是構建好起點a到其他點的最短路徑,如果要實際算出來,那麼只要確定要到達的頂點,然後一直找上乙個頂點,直到a為止就行了。。
迪傑斯特拉演算法
if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...
迪傑斯特拉演算法
dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...
迪傑斯特拉演算法
迪傑斯特拉演算法用來計算圖中某一點到其他點的最短距離,這個圖可以是加權,也可以是無權的,距離指的是從一點到其它點所經過的邊的權重和 假設現在有乙個加權無向圖,我們要求節點1到其他點的最短距離 初始化圖arr 用乙個鄰接矩陣來表示一張圖,矩陣元素 初始化一維向量d,這個向量儲存的是其他點的最短距離,初...