dijkstr算法步骤(dijkstr算法)
大家好!今天讓小編來大家介紹下關于dijkstr算法步驟(dijkstr算法)的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
您好,今天芳芳來為大家解答以上的問題。dijkstra算法步驟,dijkstra算法相信很多小伙伴還不知道,現在讓我們一起來看看吧!
1、[問題分析] 對于一個含有n個頂點和e條邊的圖來說,從某一個頂點Vi到其余任一頂點Vj的最短路徑,可能是它們之間的邊(Vi,Vj),也可能是經過k個中間頂點和k+1條邊所形成的路徑(1≤k≤n2)。
2、下面給出解決這個問題的Dijkstra算法思想。
3、 設圖G用鄰接矩陣的方式存儲在GA中,GA[i,j]=maxint表示Vi,Vj是不關聯的,否則為權值(大于0的實數)。
4、設集合S用來保存已求得最短路徑的終點序號,初始時S=[Vi]表示只有源點,以后每求出一個終點Vj,就把它加入到集合中并作為新考慮的中間頂點。
5、設數組dist[1..n]用來存儲當前求得的最短路徑,初始時Vi,Vj如果是關聯的,則dist[j]等于權值,否則等于maxint,以后隨著新考慮的中間頂點越來越多,dist[j]可能越來越小。
6、再設一個與dist對應的數組path[1..n]用來存放當前最短路徑的邊,初始時為Vi到Vj的邊,如果不存在邊則為空。
7、 執行時,先從S以外的頂點(即待求出最短路徑的終點)所對應的dist數組元素中,找出其值最小的元素(假設為dist[m]),該元素值就是從源點Vi到終點Vm的最短路徑長度,對應的path[m]中的頂點或邊的序列即為最短路徑。
8、接著把Vm并入集合S中,然后以Vm作為新考慮的中間頂點,對S以外的每個頂點Vj,比較dist[m]+GA[m,j]的dist[j]的大小,若前者小,表明加入了新的中間頂點后可以得到更好的方案,即可求得更短的路徑,則用它代替dist[j],同時把Vj或邊(Vm,Vj)并入到path[j]中。
9、重復以上過程n2次,即可在dist數組中得到從源點到其余各終點的最段路徑長度,對應的path數組中保存著相應的最段路徑。
10、 下面給出具體的Dijkstra算法框架(注:為了實現上的方便,用一個一維數組s[1..n]代替集合S,用來保存已求得最短路徑的終點集合,即如果s[j]=0表示頂點Vj不在集合中,反之,s[j]=1表示頂點Vj已在集合中)。
11、 Procedure Dijkstra(GA,dist,path,i); {表示求Vi到圖G中其余頂點的最短路徑,GA為圖G的鄰接矩陣,dist和path為變量型參數, 其中path的基類型為集合} Begin For j:=1 To n Do Begin {初始化} If j<>i Then s[j]:=0 Else s[j]:=1; dist[j]:=GA[i,j]; If dist[j] 12、首先來分析Dijkstra的算法思想設圖G用鄰接矩陣的方式存儲在GA中,GA[I,j]=maxint表示vi,vj是不關聯的,否則為權值(大于0的實數)。 13、設集合S用來存儲保存已求得最短路徑的終點序號,初始時S=[vi]表示只有源點,以后每求出一個終點vj,就把它加入到集合中并作為新考慮的中間頂點。 14、設數組dist[1..n]用來存儲當前求得的最短路徑,初始時vi,vj如果是關聯的,則dist[j]等于權值,否則等于maxint,以后隨著新考慮的中間頂點越來越多,dist[j]可能越來越小。 15、再設一個與dist對應的數組path[1..n]用來存放當前最短路徑的邊,初始時vi到vj的邊,如果不存在邊則為空。 16、執行時,先從S以外的頂點(即待求出最短路徑的終點)所對應的dist數組元素中,找出其值最小的元素(假設為dist[m]),該元素值就是從源點vi到終點vm的最短路徑長度,對應的path[m]中的頂點或邊的序列即為最短路徑。 17、接著把vm并入集合S中,然后以vm作為新考慮的中間頂點,對S以外的每個頂點vj,比較dist[m]+GA[i,j]與dist[j]的大小,若前者小,表明加入了新的中間頂點后可以得到更好的方案,即可求得更短的路徑,則用它代替dist[j],同時把vj或邊(vm,vj)并入到path[j]中。 18、重復以上過程n2次,即可在dist數組中得到從源點到其余個終點的最短路徑長度,對應的path數組中保存著相應的最短路徑。 19、為了實現上的方便,用一個一維數組s[1..n]代替集合s,用來保存已求得最短路徑的終點集合,即如果s[j]=0表示頂點vj不在集合中,反之,s[j]表示頂點vj已在集合中)。 20、Procedure dijkstra (GA,dist path,I) begin for j:= 1 to n do begin if j<>I then s[j]:=0;{j不在集合中} else s[j]:=1;{j在集合中}; dist[j]:=GA[I,J];IF dist [j] 本文就為大家分享到這里,希望小伙伴們會喜歡。 以上就是小編對于dijkstr算法步驟(dijkstr算法)問題和相關問題的解答了,dijkstr算法步驟(dijkstr算法)的問題希望對你有用!
以上是生活随笔為你收集整理的dijkstr算法步骤(dijkstr算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
總結
- 上一篇: 《和傅大农与僚故别诗》第十四句是什么
- 下一篇: 如何填写个人简历?