版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、單源最短路徑問題所謂單源最短路徑問題是指:已知圖 G(V,E),到 V 中的每個結(jié)點(diǎn)的最短路徑。希望找出從某給定的源結(jié)點(diǎn) SV首先,可以發(fā)現(xiàn)有這樣一個事實(shí):如果 P 是 G 中從 vs 到 vj 的最短路,vi 是 P 中的一個點(diǎn),那么,從 vs 沿 P 到 vi 的路是從 vs 到 vi 的最短路。對于圖 G,如果所有 Wij0 的情形下,目前公認(rèn)的最好的方法是由 Dijkstra 于 1959 年提出來的。Dijkstra 算法基本:設(shè)置頂點(diǎn)集合 S 并不斷地作貪心選擇來擴(kuò)充這個集合。一個頂點(diǎn)屬于集合S 當(dāng)且僅當(dāng)從源到該頂點(diǎn)的最短路徑長度已知。初始時,S 中僅含有源節(jié)點(diǎn)。設(shè) u 是 G 的
2、某一個頂點(diǎn),把從源到 u 且中間只經(jīng)過 S 中頂點(diǎn)的路稱為從源到 u 的特殊路徑,用數(shù)組 Di頂點(diǎn) i 當(dāng)前所對應(yīng)的最短特殊路徑長度。(3)Dijkstra 算法每次從 V-S 中取出具有最短特殊路長度的頂點(diǎn) u,將 u 添加到 S 中,同時對數(shù)組 D 作必要的修改。(4)一旦 S 包含了所有 V 中頂點(diǎn),dist 就源程序 1:/Dijkstra 算法#include #include了從源到所有其它頂點(diǎn)之間的最短路徑長度。using namespatd;#define VEX5/定義結(jié)點(diǎn)的個數(shù)#define maxpo100double graphmaxpo 0 , 10 , -1 , 3
3、0 , 100 , -1 , 0 , 50 , -1 , -1 , -1 , -1 , 0 , -1 , 10 , -1 , -1 , 20 , 0 , 60 , -1 , -1 , -1 , -1 , 0 ; /鄰接矩陣=void main()Rmaxpo=0,Bmaxpo;DVEX,PVEX;/定義數(shù)組 D 用來存放結(jié)點(diǎn)特殊距離,P 數(shù)組存放父親結(jié)點(diǎn)/初始時,紅點(diǎn)集中僅有源結(jié)點(diǎn) 0 R0=1; B0=0;for(Bi=1;i=1;iVEX;i+)/對數(shù)組 D、P 進(jìn)行初始化for(i=0;iVEX;i+)Di=graph0i;if(Di!=-1) Pi=0;els=-1;/輸出鄰接矩陣 f
4、or(i=0;iVEX;i+)for(j=0;jVEX;j+)coutgraphijt;coutendl;/輸出 D、P 表頭cout;for(i=0;iVEX;i+)coutDi;cout;for(i=0;iVEX;i+) coutPicoutendl;for(for(k=1;kVEX;k+)/每次從藍(lán)點(diǎn)集中取出具有最短特殊路長度的結(jié)點(diǎn) minmin=0;Bmin=0;) min+; /求藍(lán)點(diǎn)集結(jié)點(diǎn)最小下標(biāo)元素for(j=min;jVEX;j+)if(Dj!=-1&DjDmin&Bj=1)min=j; coutmin=min;/將具有最短特殊路長度的結(jié)點(diǎn) min 添加到紅點(diǎn)集中Rmin=1;
5、 Bmin=0;/對數(shù)組 D 作必要的修改for(j=1;jDmin+graphminj|Dj=-1)Dj=Dmin+graphminj;/每次迭代求最小值,最后一次即為到源點(diǎn)的最短路徑Pj=min;/輸出最短路徑for(i=0;iVEX;i+) coutDi;cout;for(i=0;iVEX;i+) coutPi coutendl;源程序 2:#includeusing namespatd;/ Graph.h#define maxPo100 class CGraphpublic: CGraph(void);CGraph(void);bool SetGraph( double gmaxPom
6、axPo bool Dijkstra();void Display();GetStartPo(); ,startPo,size );double GetBestWay(private:dest ,path ,&pathLen );bool solved;/標(biāo)志當(dāng)前圖是否已經(jīng)求解double graphmaxPomaxPo;/當(dāng)前圖布局 size;/地圖大小startPo;/起點(diǎn)double distmaxPo;/當(dāng)前圖的解 prevmaxPo;/ Graph.cppCGraph:CGraph(void)for(for(i = 0 ; i maxPo; i+ )j = 0 ; j maxPo;
7、j+ )graphij = -1;startPo size = -1;= -1;solved = false; /當(dāng)前圖還沒有求解CGraph:CGraph(void)/bool CGraph:SetGraph( double gmaxPomaxPo ,startPo,size )for(for(i = 0 ; i size ; i+ )j = 0 ; j startPo= startPo;this-size = size; solved = false; Dijkstra(); return true;/bool CGraph:Dijkstra()bool smaxPo;for(j = 0
8、; j size ; j+ )distj = graphstartPoj; sj = false;if( distj 0 ) /disti0,表示沒有路徑連接prevj = 0; elseprevj = startPo;結(jié)點(diǎn) startPo與結(jié)點(diǎn) j/從起點(diǎn)出發(fā)diststartPo = 0; sstartPo = true;for(i = 0 ; i size ; i+ )double temp;u = startPo; bool flag = false;for(j = 0 ; j 0 & distj temp )u = j;temp = distj;elseu = j;temp = di
9、stj; flag = true;su = true;for( j = 0 ; j 0 )double newDist = distu + graphuj; if( distj 0 | newDist distj )distj = newDist; prevj = u;solved = true; return true;/void CGraph:Display()prf( 當(dāng)前地圖的鄰接矩陣n );for(i = 0 ; i size ; i+ )for(j = 0 ; j size ; j+ )prf( %5.f , graphij );prf( n );/double CGraph:Ge
10、tBestWay(p = dest; thewaymaxPo; len = 0;while( p != startPo)thewaylen = p; p = prevp; len+;thewaylen = startPo; len+;dest ,path ,&pathLen )for(i = 0 , j = len - 1 ; i len ; i+ , j- )pathi = thewayj; pathLen = len;return distdest;/CGraph:GetStartPo()return startPo;/ Dijkstra.cpp : 定義控制臺應(yīng)用程序的voidmain(
11、)double graphmaxPo = 0 , 10 , -1 , 30 , 100 , -1 , 0 , 50 , -1 , -1 , -1 , -1 , 0 , -1 , 10 , -1 , -1 , 20 , 0 , 60 , -1 , -1 , -1 , -1 , 0 ;size = 5;start = 0;點(diǎn)。dest = 1; pathlen; pathmaxPo;double dist;CGraph g;g.SetGraph( graph , start , size ); g.Display();prf( n );for( dest = 0 ; dest size ; dest+ )dist
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 趣味歷史常識一百題及答案
- 配色培訓(xùn)課件圖片
- 專題3.3 代數(shù)式全章專項(xiàng)復(fù)習(xí)-2024-2025學(xué)年七年級數(shù)學(xué)上冊舉一反三系列(人教版2024)(解析版)
- 櫥窗賣貨培訓(xùn)課件
- 2023年度北京市政府采購評審專家資格自我檢測試卷A卷附答案
- 藥店店長培訓(xùn)課件
- 腹部保養(yǎng)培訓(xùn)課件
- 委托生產(chǎn)加工合同
- 2021年教師資格證考試《小學(xué)教育學(xué)》試題及答案匯編
- 北京市房山區(qū)2024-2025學(xué)年九年級(上)期末物理試卷(含答案)
- 人工氣道濕化的護(hù)理培訓(xùn)課件
- 電網(wǎng)適用的法律法規(guī)標(biāo)準(zhǔn)規(guī)范清單
- 讀書分享-給教師的一百條建議
- GB/T 4269.3-2000農(nóng)林拖拉機(jī)和機(jī)械、草坪和園藝動力機(jī)械操作者操縱機(jī)構(gòu)和其他顯示裝置用符號第3部分:草坪和園藝動力機(jī)械用符號
- GB/T 11618.1-2008銅管接頭第1部分:釬焊式管件
- 開工復(fù)工第一課
- 安徽省淮南市鳳臺縣基層診所醫(yī)療機(jī)構(gòu)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心村衛(wèi)生室地址信息
- 旅游服務(wù)禮儀說課市公開課金獎市賽課一等獎?wù)n件
- 【線性代數(shù)自考練習(xí)題】滇西應(yīng)用技術(shù)大學(xué)專升本真題匯總(附答案解析)
- 英語北京版四年級(上冊)單詞匯總
- 組織知識清單
評論
0/150
提交評論