




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
一、課題名稱用分枝限界法求解單源最短路徑問題二、課題內(nèi)容和要求設(shè)計(jì)要求:學(xué)習(xí)算法設(shè)計(jì)中分枝限界法的思想,設(shè)計(jì)算法解決數(shù)據(jù)結(jié)構(gòu)中求解單源最短路徑問題,編程實(shí)現(xiàn):(1)給出指定源點(diǎn)的單源最短路徑;(2)說明算法的時(shí)間復(fù)雜度。三、需求分析1.實(shí)現(xiàn)極小堆的創(chuàng)建,用來存儲活結(jié)點(diǎn)表。2.實(shí)現(xiàn)循環(huán)隊(duì)列的創(chuàng)建、初始化、入隊(duì)、出隊(duì)等操作。3.實(shí)現(xiàn)分支限界法來實(shí)現(xiàn)求解單元最短路徑的算法。4.實(shí)現(xiàn)最短路徑的正確輸出。四、概要設(shè)計(jì)建立工程MinPath.dsw,加入源文件main.cpp,頭文件CirQueue.h,init.h,Minpath.h和output.h.CirQueue.h中實(shí)現(xiàn)極小堆的創(chuàng)建,循環(huán)隊(duì)列的創(chuàng)建、初始化、入隊(duì)、出隊(duì)等操作,Minpath.h中實(shí)現(xiàn)分支限界法來實(shí)現(xiàn)求解單元最短路徑的算法。output.h中實(shí)現(xiàn)最短路徑的正確輸出。如下圖所示:實(shí)驗(yàn)用例如下,通過鄰接矩陣的方式寫在init.h中:1125811346971023432922122237333522五、詳細(xì)設(shè)計(jì)main函數(shù):#include<iostream.h>#include"init.h"#include"CirQueue.h"#include"MinPath.h"#include"output.h"voidmain(){ intk; intq; cout<<"------------歡迎使用本系統(tǒng)---------------"<<endl; cout<<"------------請選擇單元路徑的起點(diǎn):---------------"<<endl; cout<<"------------提示:輸入"<<1<<"到"<<n-1<<"之間的整數(shù)---------------"<<endl; cin>>k; cout<<"------------請選擇單元路徑的終點(diǎn):---------------"<<endl; cin>>q; while(k<1||k>11) { cout<<"------------提示:輸入"<<1<<"到"<<n-1<<"之間的數(shù),請重新輸入---------------"<<endl; cin>>k; }MinPath(k); output(k,q);}init.hconstintsize=200;constintinf=1000;//兩點(diǎn)距離上界置為1000constintn=12;//圖頂點(diǎn)個數(shù)加1intprev[n];//圖的前驅(qū)頂點(diǎn)intdist[]={0,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf};//最短距離數(shù)組intc[n][n]={{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,2,3,4,inf,inf,inf,inf,inf,inf,inf},{0,inf,0,3,inf,7,2,inf,inf,inf,inf,inf},{0,inf,inf,0,inf,inf,9,2,inf,inf,inf,inf},{0,inf,inf,inf,0,inf,inf,2,inf,inf,inf,inf},{0,inf,inf,inf,inf,0,inf,inf,3,3,inf,inf},{0,inf,inf,inf,inf,inf,0,1,inf,3,inf,inf},{0,inf,inf,inf,inf,inf,inf,0,inf,5,1,inf},{0,inf,inf,inf,inf,inf,inf,inf,0,inf,inf,3},{0,inf,inf,inf,inf,inf,inf,inf,inf,0,inf,2},{0,inf,inf,inf,inf,inf,inf,inf,inf,2,inf,2},{0,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,0},};//圖的鄰接矩陣CirQueue.hclassMinHeapNode//創(chuàng)建極小堆用來存儲活結(jié)點(diǎn)表{public:inti;//頂點(diǎn)編號intlength;//當(dāng)前路長};classCirQueue//循環(huán)隊(duì)列{private:intfront,rear;//頭指針和尾指針MinHeapNodedata[size];public:CirQueue()//初始化建空隊(duì)列{front=rear=0;}voidqueryIn(MinHeapNodee)//元素入隊(duì)操作{ if((rear+1)%size!=front)//隊(duì)列未滿 { rear=(rear+1)%size;//插入新的隊(duì)尾元素 data[rear]=e;//在隊(duì)尾插入元素 }}voidqueryOut()//元素出隊(duì)操作{if(rear!=front){front=(front+1)%size;//刪除隊(duì)頭元素}}MinHeapNodegetQuery()//讀取隊(duì)頭元素,但不出隊(duì){if(rear!=front){returndata[(front+1)%size];}returndata[1];}boolempty()//判斷隊(duì)列是否為空{(diào)returnfront==rear;}boolfull()//判斷隊(duì)列是否為滿{return(rear+1)%size==front;}};//CirQueue結(jié)束MainPath.hvoidMinPath(intv){CirQueues;//定義源為初始擴(kuò)展結(jié)點(diǎn)MinHeapNodee;e.i=v;e.length=0;dist[v]=0;s.queryIn(e);//將源節(jié)點(diǎn)加入隊(duì)列while(true){for(intj=1;j<n;j++){if(j>=n){ break;}MinHeapNodem=s.getQuery();if((c[m.i][j]<inf)&&(m.length+c[m.i][j]<dist[j]))//頂點(diǎn)i到頂點(diǎn)j可達(dá),且從源出發(fā)途經(jīng)i到j(luò)的路徑長度小于當(dāng)前最優(yōu)路徑長度{dist[j]=m.length+c[m.i][j];prev[j]=m.i; MinHeapNodemi;//加入活結(jié)點(diǎn)優(yōu)先隊(duì)列mi.i=j; mi.length=dist[j];if(s.full()) { break; }s.queryIn(mi);//元素入隊(duì)}}//for循環(huán)結(jié)束if(s.empty()){break;}s.queryOut();//當(dāng)該結(jié)點(diǎn)的孩子結(jié)點(diǎn)全部入隊(duì)后,刪除該結(jié)點(diǎn)}//while循環(huán)結(jié)束}//方法結(jié)束output.hvoidoutput(intk,intq){intq1=q;if(dist[q1]==1000){ cout<<"------------找不到此路徑---------------"<<endl; return;}cout<<"最短路徑長為:"<<dist[q1]<<endl;cout<<"單源最短路徑為:";inta[12]={0};intt=q1;ints=0;for(inti=0;t!=k;i++){ a[i]=prev[t]; t=prev[t]; s=s+1;}for(i=s-1;i>-1;i--){ cout<<a[i]<<"";}cout<<q1;cout<<endl<<"------------歡迎使用本系統(tǒng)---------------"<<endl;}六、測試數(shù)據(jù)及其結(jié)果分析1.選擇起點(diǎn):1,終點(diǎn):111到11最短路徑長為8,為1->3->7->10->11所獲得。2.選擇起點(diǎn):2,終點(diǎn):92到9最短路徑長為5,為2->6->9所獲得。3.選擇起點(diǎn)8,終點(diǎn)28到2沒有路徑,輸出“找不到此路徑”。4.選擇起點(diǎn)11,終點(diǎn)111到1沒有路徑,輸出“找不到此路徑”。七、調(diào)試過程中的問題1.CirQueue.h中,函數(shù)getQuery()中在調(diào)試過程中出現(xiàn)warnig:'CirQueue::getQuery':notallcontrolpathsreturnavalue.解決方案:在if語句下面加上returndata[1];使當(dāng)rear=front時(shí)函數(shù)也返回一個值。2.當(dāng)兩結(jié)點(diǎn)間沒有路徑時(shí),程序執(zhí)行時(shí)出現(xiàn)錯誤。解決方案:在輸出函數(shù)output中加入下面代碼if(dist[q1]==1000){ cout<<"------------找不到此路徑---------------"<<endl; return;}即當(dāng)兩結(jié)點(diǎn)無路徑時(shí),輸出提示“找不到此路徑”,程序執(zhí)行時(shí)不會崩潰。3.輸出過程中,如何使結(jié)點(diǎn)按順序輸出?定義一個數(shù)組a[],應(yīng)用遞歸對存儲前驅(qū)結(jié)點(diǎn)的數(shù)組prev[]從后往前求解,將得到的值賦給數(shù)組a[],最后逆向輸出對應(yīng)的數(shù)組a[],即得到正確的路徑順序。如下:for(inti=0;t!=k;i++){ a[i]=prev[t]; t=prev[t]; s=s+1;}for(i=s-1;i>-1;i--){ cout<<a
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)識標(biāo)牌等制作安裝合同范本
- 設(shè)備技術(shù)研究開發(fā)合同范本
- 音頻制作合同范本
- 低價(jià)藍(lán)牙耳機(jī)轉(zhuǎn)讓合同范本
- 合同范本簽訂
- 臥式加工中心合同范本
- 分租經(jīng)營合同范本
- 合租養(yǎng)蝦合同范例
- 包裝商品采購合同范本
- 加油站油卡合同范本
- 醫(yī)院培訓(xùn)課件:《靜脈中等長度導(dǎo)管臨床應(yīng)用專家共識》
- 智能倉儲物流系統(tǒng)開發(fā)合同
- 增加經(jīng)營范圍怎么寫申請書范文
- 循環(huán)伏安法 課件
- 人教版數(shù)學(xué)四年級下冊核心素養(yǎng)目標(biāo)全冊教學(xué)設(shè)計(jì)
- GB/T 44114-2024電化學(xué)儲能系統(tǒng)接入低壓配電網(wǎng)運(yùn)行控制規(guī)范
- 冀教版五年級數(shù)學(xué)下冊全冊課件【完整版】
- 2023年12月16日基金從業(yè)《證券投資基金》真題卷(67題)
- 2023江蘇護(hù)理職業(yè)學(xué)院高職單招語文/數(shù)學(xué)/英語筆試參考題庫含答案解析
- (2024年)教師教案檢查量化評價(jià)評分表
- 典型火災(zāi)案例及消防安全知識專題培訓(xùn)
評論
0/150
提交評論