已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Dijkstra算法Dijkstra算法是典型最短路算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。Dijkstra算法能得出最短路徑的最優(yōu)解,但由于它遍歷計(jì)算的節(jié)點(diǎn)很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多專業(yè)課程中都作為基本內(nèi)容有詳細(xì)的介紹,如數(shù)據(jù)結(jié)構(gòu),圖論,運(yùn)籌學(xué)等等。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時(shí)標(biāo)號(hào)方式,一種是用OPEN,CLOSE表方式,Drew為了和下面要介紹的A*算法和D*算法表述一致,這里均采用OPEN,CLOSE表的方式。其采用的是貪心法的算法策略大概過程:創(chuàng)建兩個(gè)表,OPEN,CLOSE。OPEN表保存所有已生成而未考察的節(jié)點(diǎn),CLOSED表中記錄已訪問過的節(jié)點(diǎn)。1訪問路網(wǎng)中距離起始點(diǎn)最近且沒有被檢查過的點(diǎn),把這個(gè)點(diǎn)放入OPEN組中等待檢查。2從OPEN表中找出距起始點(diǎn)最近的點(diǎn),找出這個(gè)點(diǎn)的所有子節(jié)點(diǎn),把這個(gè)點(diǎn)放到CLOSE表中。3遍歷考察這個(gè)點(diǎn)的子節(jié)點(diǎn)。求出這些子節(jié)點(diǎn)距起始點(diǎn)的距離值,放子節(jié)點(diǎn)到OPEN表中。4重復(fù)第2和第3步,直到OPEN表為空,或找到目標(biāo)點(diǎn)。編輯本段算法實(shí)現(xiàn)#include#defineMaxNum765432100usingnamespacestd;ifstreamfin(Dijkstra.in);ofstreamfout(Dijkstra.out);intMap501501;boolis_arrived501;intDist501,From501,Stack501;intp,q,k,Path,Source,Vertex,Temp,SetCard;intFindMin()intp,Temp=0,Minm=MaxNum;for(p=1;p=Vertex;p+)if(DistpSourceVertex;for(p=1;p=Vertex;p+)for(q=1;qMappq;if(Mappq=0)Mappq=MaxNum;for(p=1;p=Vertex;p+)Distp=MapSourcep;if(Distp!=MaxNum)Fromp=Source;elseFromp=p;is_arrivedSource=true;SetCard=1;doTemp=FindMin();if(Temp!=0)SetCard=SetCard+1;is_arrivedTemp=true;for(p=1;pDistTemp+MapTempp)&(!is_arrivedp)Distp=DistTemp+MapTempp;Fromp=Temp;elsebreak;while(SetCard!=Vertex);for(p=1;p=Vertex;p+)if(p!=Source)fout=n;foutSource:SourcenTarget:pn;if(Distp=MaxNum)foutDistance:Infinityn;foutPath:NoWay!;elsefoutDistance:Distpn;k=1;Path=p;while(FromPath!=Path)Stackk=Path;Path=FromPath;k=k+1;foutPath:=1;q-)foutStackq;fout1=Source:2Target:3Distance:25Path:2-3=Source:2Target:4Distance:50Path:2-1-4=Source:2Target:5Distance:50Path:2-3-5=Source:2Target:6Distance:60Path:2-3-5-6=Source:2Target:7Distance:InfinityPath:NoWay!=示例程序及相關(guān)子程序:voidDijkstra(intn,intDistance,intiPath)intMinDis,u;inti,j;/從鄰接矩陣復(fù)制第n個(gè)頂點(diǎn)可以走出的路線,就是復(fù)制第n行到Distancefor(i=0;iVerNum;i+)Distance=Arcn,i;Visited=0;/第n個(gè)頂點(diǎn)被訪問,因?yàn)榈趎個(gè)頂點(diǎn)是開始點(diǎn)Visitedn=1;/找到該頂點(diǎn)能到其他頂點(diǎn)的路線、并且不是開始的頂點(diǎn)n、以前也沒走過。/相當(dāng)于尋找u點(diǎn),這個(gè)點(diǎn)不是開始點(diǎn)nfor(i=0;iVerNum;i+)u=0;MinDis=No;for(j=0;jVerNum;j+)if(Visitedj=0&(DistancejMinDis)MinDis=Distancej;u=j;/如范例P1871圖G6,Distance=No,No,10,No,30,100,第一次找就是V2,所以u(píng)=2/找完了,MinDis等于不連接,則返回。這種情況類似V5。if(MinDis=No)return;/確立第u個(gè)頂點(diǎn)將被使用,相當(dāng)于Arcv,u+Arcu,w中的第u頂點(diǎn)。Visitedu=1;/尋找第u個(gè)頂點(diǎn)到其他所有頂點(diǎn)的最小路,實(shí)際就是找Arcu,j、j取值在0,VerNum。/如果有Arci,u+Arcu,jArci,j,則Arci,j=Arci,u+Arcu,jArci,j/實(shí)際中,因?yàn)镈istance是要的結(jié)果,對(duì)于起始點(diǎn)確定的情況下,就是:/如果(Distanceu+Arcu,j)=Distancej則:/Distancej=Distanceu+Arcu,j;/而iPath保存了u點(diǎn)的編號(hào);/同理:對(duì)新找出的路線,要設(shè)置Visitedj=0,以后再找其他路,這個(gè)路可能別利用到。例如V3for(j=0;jVerNum;j+)if(Visitedj=0&Arcu,jNo&u!=j)if(Distanceu+Arcu,j)=Distancej)Distancej=Distanceu+Arcu,j;Visitedj=0;iPathj=u;/輔助函數(shù)voidPrim()inti,m,n=0;for(i=0;i0)if(m=MinAdjNode(n)!=-1)Tn.Nodes.Add(Tm);n=m;Visitedn+;elsen=MinNode(0);if(n0)TMin2.Nodes.Add(TMin1);Visitedn+;listBox1.Items.Add(Vn);treeView1.Nodes.Add(T0);voidTopoSort()inti,n;listBox1.Items.Clear();StackS=newStack();for(i=0;i=0;i-)if(InDegree(i)=0)S.Push(i);Visited+;while(S.Count!=0)n=(int)S.Pop();listBox1.Items.Add(Vn);ClearLink(n);for(i=VerNum-1;i=0;i-)if(Visited=0&InDegree(i)=0)S.Push(i);Visited+;voidAOETrave(intn,TreeNodeTR,intw)inti,w0;if(OutDegree(n)=0)return;for(i=0;iVerNum;i+)if(w0=Arcn,i)!=0)listBox1.Items.Add(V+t+(w+w0).ToString()+t+i.ToString()+t+n.ToString();TreeNodeT1=newTreeNode();T1.Text=V+W=+(w+w0).ToString()+;TR.Nodes.Add(T1);AOETrave(i,T1,w+w0);voidAOE()inti,w=0,m=1;TreeNodeT1=newTreeNode();for(i=0;iVerNum;i+)Visited=0;T1.Text=V0;listBox1.Items.Add(雙親表示法顯示這個(gè)生成樹:);listBox1.Items.Add(VtWtIDtPID);for(i=0;iVerNum;i+)if(w=Arc0,i)!=0)listBox1.Items.Add(V+t+w.ToString()+t+i.ToString()+t0);TreeNodeT2=newTreeNode();T2.Text=V+W=+w.ToString()+;AOETrave(i,T2,w);T1.Nodes.Add(T2);listBox1.Items.Add(tt樹+m.ToString();m+;treeView1.Nodes.Clear();treeView1.Nodes.Add(T1);intIsZero()inti;for(i=0;i=0)returni;return-1;in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鄂爾多斯市勝豐種業(yè)有限公司科研助理招聘備考題庫有答案詳解
- 3D打印生物支架在老年皮膚再生中的老化應(yīng)對(duì)策略
- 2025年九江一中招聘備考題庫及1套參考答案詳解
- 中國信達(dá)山東分公司2026年校園招聘備考題庫及1套完整答案詳解
- 小學(xué)教育課程中人工智能的引入與跨學(xué)科融合的創(chuàng)新實(shí)踐教學(xué)研究課題報(bào)告
- 2025年重慶醫(yī)科大學(xué)基礎(chǔ)醫(yī)學(xué)院關(guān)于公開遴選系主任10人的備考題庫及完整答案詳解一套
- 2025年上海當(dāng)代藝術(shù)博物館公開招聘工作人員備考題庫及1套參考答案詳解
- 2025年貴州赤水國家糧食儲(chǔ)備庫面向社會(huì)公開招聘8人備考題庫及完整答案詳解1套
- 2025年漣源市市直醫(yī)療衛(wèi)生機(jī)構(gòu)公開招聘專業(yè)技術(shù)人員69人備考題庫參考答案詳解
- 2025年蘇州交投新基建科技有限公司公開招聘備考題庫及一套答案詳解
- 英語試卷+答案黑龍江省哈三中2025-2026學(xué)年上學(xué)期高二學(xué)年12月月考(12.11-12.12)
- 中華聯(lián)合財(cái)產(chǎn)保險(xiǎn)股份有限公司2026年校園招聘備考題庫及一套完整答案詳解
- 詩經(jīng)中的愛情課件
- 2025年煙花爆竹經(jīng)營單位安全管理人員考試試題及答案
- 2025天津大學(xué)管理崗位集中招聘15人參考筆試試題及答案解析
- 2025年云南省人民檢察院聘用制書記員招聘(22人)考試筆試參考題庫及答案解析
- TCAMET02002-2019城市軌道交通預(yù)埋槽道及套筒技術(shù)規(guī)范
- 基于邏輯經(jīng)驗(yàn)主義對(duì)命題的分析
- 中文介紹邁克爾杰克遜
- 安徽綠沃循環(huán)能源科技有限公司12000t-a鋰離子電池高值資源化回收利用項(xiàng)目(重新報(bào)批)環(huán)境影響報(bào)告書
- 廈深鐵路福建段某標(biāo)段工程投標(biāo)施工組織設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論