版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)名稱短途徑
課程名稱數(shù)據(jù)結(jié)構(gòu)與算法實(shí)驗(yàn)
專業(yè)班級(jí):信息安全
學(xué)號(hào):
姓名:
實(shí)驗(yàn)六最短途徑
一、實(shí)驗(yàn)?zāi)康?/p>
1.學(xué)習(xí)掌握?qǐng)D的存儲(chǔ)結(jié)構(gòu)
2.學(xué)會(huì)編寫(xiě)求最短途徑的算法
二、實(shí)驗(yàn)內(nèi)容
1、實(shí)驗(yàn)題目
編寫(xiě)代碼實(shí)現(xiàn)Dijkstra生成最短途徑的算法,其中要有完整的圖的輸入輸出
2、簡(jiǎn)樸介紹
圖的存儲(chǔ):用鄰接矩陣,這樣會(huì)方便不少。
鄰接矩陣是一個(gè)二維數(shù)組,數(shù)組中的元素是邊的權(quán)(一些數(shù)值),數(shù)組下標(biāo)號(hào)為結(jié)點(diǎn)的標(biāo)號(hào)。
(1)例如二維數(shù)組中的一個(gè)元素M[5][6]的值為39,則表達(dá)結(jié)點(diǎn)5、6連接,且其上的權(quán)值
為39。
(2)用鄰接矩陣存儲(chǔ)圖,對(duì)圖的讀寫(xiě)就簡(jiǎn)樸了。由于鄰接矩陣就是一個(gè)二維數(shù)組,因此對(duì)圖的
讀寫(xiě)就是對(duì)二維數(shù)組的操作。只要能弄清楚邊的編號(hào),就能把圖讀入了。
用一對(duì)結(jié)點(diǎn)表達(dá)邊(也就是輸入的時(shí)候輸入一對(duì)結(jié)點(diǎn)的編號(hào))
求最短途徑的算法:
求最短途徑就是求圖中的每一個(gè)點(diǎn)到圖中某一個(gè)給定點(diǎn)(這里認(rèn)為是編號(hào)為0的點(diǎn))的最短
距離。
具體算法就是初始有一個(gè)舊圖,一個(gè)新圖。開(kāi)始的時(shí)候舊圖中有所有的結(jié)點(diǎn),新圖中初始為
只有一個(gè)結(jié)點(diǎn)(源點(diǎn),途徑的源頭)。整個(gè)算法就是不斷的從舊圖中往新圖中添加點(diǎn),直到所
有的點(diǎn)都添加到新圖中為止。
要實(shí)現(xiàn)這個(gè)算法,除了用二維數(shù)組保存圖,還需要使用到兩個(gè)輔助的數(shù)組
數(shù)組find[N]:此數(shù)組是用來(lái)表達(dá)標(biāo)號(hào)相應(yīng)的結(jié)點(diǎn)是否已經(jīng)被添加到新圖中(由于只有舊圖
中的點(diǎn)我們才需要添加到新圖中,并且只有舊圖中點(diǎn)到源點(diǎn)的距離,我們才需要進(jìn)行更新)
其中N為圖中結(jié)點(diǎn)的個(gè)數(shù)。
數(shù)組distance[N]:此數(shù)組記錄圖中的點(diǎn)到源點(diǎn)的距離。這個(gè)數(shù)組里面存放的值是不斷進(jìn)行
更新的。其中N為圖中結(jié)點(diǎn)的個(gè)數(shù)。
大的循環(huán):逐一把舊圖中的所有點(diǎn)添加到新圖中.,
循環(huán):遍歷distance數(shù)組,找distance數(shù)組中屬于舊圖中的點(diǎn),其中
distance最小的那個(gè)結(jié)點(diǎn)
把找到的結(jié)點(diǎn)添加到新圖中.,
更新distance數(shù)組,因?yàn)樾绿砑恿艘粋€(gè)點(diǎn)到新圖中,所以可能能找到
一條通過(guò)這條點(diǎn)的新的路徑,這條路徑可能比原來(lái)的路徑更短.。
3、程序簡(jiǎn)樸模板
只是參考,不需要照著這個(gè)來(lái)寫(xiě)
〃最短途徑
#ifndefMYGRAPH_H_
#defineMYGRAPH_H_
classMyGraph
(
public:
ovoidreadDirectedGraph();
oMyGraph(intsize);//構(gòu)造函數(shù)中設(shè)立圖的大小,分派空間
avoidwriteGraph();
voidshortPath(intsource);〃求最短途徑
protected:
private:
“nt**m_graph;〃用二維數(shù)組保存圖
°intm_size;〃圖的大小
0
);
#endif
/////////////////////////////////////////////////////////////////////
〃構(gòu)造函數(shù)中設(shè)立圖的大小,分派空間
MyGraph::MyGraph(intsize)
(
“nti,j;
m_size=size;
〃給圖分派空間
n)_graph=newint*[m_size];
ofor(i=0;i<m_size;i++)
°{
6m_graph[i]=newint[m_size];
°}
ofor(i=0;i<m_size;i++)
(
?>fdr(j—0;j<m_size;j++)
00{
m_graph[i][j]=INT_MAX;
)
°}
三、實(shí)驗(yàn)代碼
#inc1ude<iostream>
#include<iomanip>
#inc1ude<stack>
#inelude<deque>
#inc1ude<fstream>
usingnamespacestd;
struetprimnode
(
public:
charbegvex;
charendvex;
intlowcost;
);
structadknode
(
intdist;〃最近距離
charway[50];//頂點(diǎn)數(shù)組
intnodenum;〃通過(guò)的頂點(diǎn)數(shù)
);
classMgraph//鄰接矩陣儲(chǔ)存結(jié)構(gòu)
public:
Mgraph(){}
~Mgraph(){}
voidCreatMGraph();
voidDFS(int);〃用遞歸實(shí)現(xiàn)
voidDFSl(int);//非遞歸
voidBFS(int);
voidprint();
voidprim();
intmini();
int1ow();〃最短距離函數(shù)的輔助函數(shù)
intLocateVex(char);
voidkruskal();
voidDijkstra();
voidFloyd();
private:
intnumber;//頂點(diǎn)數(shù)目
intarcnum;//邊的數(shù)目
charvexs[50];
intarcs[50][50];
intvisited[50];//便利時(shí)的輔助工具
primnodecloseedge[50];//prim
adknodedist[50];//最短途徑
intD[20][20];//floyd算法距離
intP[20][20][20];//f1oyd算法途徑
};
intMgraph::LocateVex(chars)
for(inti=0;i<number;i++)
if(vexs[i]==s)
returni;
return-1;
)
voidMgraph::print()
(
coutV〈”頂點(diǎn)為:”;
for(intk=0;k<number;k++)
cout?vexs[k];
cout<<end1;
for(inti=0;i<number;i++)
{
for(intj=0;j<number;j++)
cout<<setw(6)?left?arcs[i][j]?"n;
cout?end1;
)
fbr(intm=0;m<number;m++)
cout?visited[m];
cout?endl;
)
voidMgraph::CreatMGraph()〃圖的鄰接矩陣儲(chǔ)存結(jié)構(gòu)
(
charvexl,vex2;
inti,j,k,m;
coutVv”請(qǐng)輸入定點(diǎn)數(shù),邊數(shù):"v<endl;
cin>>number>>arcnum;
coutvv”請(qǐng)輸入頂點(diǎn)(字符串類型):“<<endl;
for(i=0;i<number;i++)
cin>>vexs[i];
for(i=0;i<number;i++)
for(j=0;j<number;j++)
arcs[i]|j]=1000;
for(k=0;k<arcnum;k++)
(
cout?”請(qǐng)輸入邊的兩個(gè)頂點(diǎn)及邊的權(quán)值:"<<end1;
cin>>vexl>>vex2?m;
i=LocateVex(vexl);
j=LocateVex(vex2);
arcs[i][j]=m;
arcs[j][i]=m;
)
)
voidMgraph::DFS(inti=0)〃用遞歸實(shí)現(xiàn)
(
intj;
cout<<vexs[i]?M------>”;
visited[i]=1;
for(j=0;j<number;j++)
if(!(arcs[i][j]==1000)&&!visited[j])
DFS(j);
}
voidMgraph::DFS1(inti=0)//非遞歸
stack<int>st;
st.push(i);
while(!st.empty())
(
intj=st.top();
St.pop();
cout<<vexs[j]?"---->";
visited[j]=1;
for(intk=0;k<number;k++)
(
if((!(arcs[j][k]==1000))&&!visitedLk])
st.push(k);
)
)
voidMgraph::BFS(inti=O)〃廣度優(yōu)先遍歷
(
deque<int>de;
de.push_back(i);
cout<<vexs[i]<<*'——--->**;
visitedfi]=1;
whi1e(!de.empty())
intk=de.front();
for(intj=0;j<number;j++)
(
if(arcs[k][j]!=1000&&!visited[j])
|
cout?vexs[j]?n-......
visited[j]=l;
de.push_back(j);
)
)
de.pop_front();
)
)
intMgraph::mini()
(
staticinti;
intmin=0;
for(intj=0;j<number;j++)
(
if(!visited[j])
(
if(closeedge[min].lowcost>closeedge[j].lowcost)
min=j;
)
i=min;
cout<<"涉及邊("v<closeedge[i].begvex<closeedge[i].endvex<<M)u;
returni;
)
voidMgraph::prim()
(
charu;
cout<<”請(qǐng)輸入起始頂點(diǎn):"?endl;
cin?u;
inti=LocateVex(u);
visited[i]=1;
for(intj=0;j<number;j++)
(
c1oseedge[j].begvex=u;
closeedge[j].endvex=vexs[j];
c1oseedge|j].lowcost=arcs[i][j];
)
for(intm=l;m<number;m++)
(
intn=mini();
visited[n]=l;
c1oseedge[nJ.lowcost=l000;
for(intp=0;p<number;p++)
if(!visited[p])
if(arcsLp][n]<closeedgelpj.lowcost)
(
closeedge[pj.lowcost=arcs[p][n];
closeedge[p].begvex=vexs[n];
)
)
)
)
)
voidMgraph::kruska1()
(
inta,b,k=0;
intmin=l000;
intarcsl[20][20];
for(intm=0;m<number;m++)
visited[m]=m;〃每一個(gè)頂點(diǎn)屬于一顆樹(shù)
for(inti=0;i<number;i++)
for(intj=O;j<number;j++)
arcsl[i][j]=arcs[i]Lj];
whi1e(k<number-1)
{
min=1000;
for(inti=0;i<number;i++)
for(intj=0;j<number;j++)
if(arcsl[iJ[j]<min)
(
a=i;
b=j;
min=arcsl[ij[jj;
)
)
)
if(visited[a]!=visited[b])
{
cout<<"涉及邊<"?vexs[a]?","?vexs[b]?")";
k++;
for(intn=0;n<number;n++)
(
if(visited[n]==visited[b])
visited[n]=visited[a];
)
}
e1se
arcsl[a|[b]=arcs[b][a]=1000;
}
)
voidMgraph::Dijkstra()
cout<<”請(qǐng)輸入起始點(diǎn)”<Vendl;
charu;
cin?u;
inti=LocateVex(u);
visited[i]=1;
for(intj=0;j<number;j++)
{
dist[j].dist=arcs[i][j];
dist[j].nodenum=0:
)
for(j=l;j<number;j++)
(
intdistance=1000;
intmin=0;
for(intn=0;n<number;n++)
(
if(!visited[n])
{
if(distance>dist[n].dist)
(
distance=dist[n].dist;
min=n:
intm=min;
visited[m]=1:
for(n=0;n<number;n++)
{
if(!visitedlnj)
(
if((dist[m].dist+arcs[m]LnJ)<dist[n].dist)
(
dist[n].dist=dist[m].dist+arcs[mj[n];
dist[n].nodenum=0;
for(intx=0;x<distLmJ.nodenum;x++)
(
dist[n].way[x]=dist[m].way[x];
dist[n].nodenum++;
)
dist[n].way[dist[n].nodenum++]=vexs[m];
}}}}
//輸出功能
for(intn=0;n<number;n++)
(
if(n!=i)
{if(dist[n].dist<1000)
|
cout?vexs[i至lj"V<vexs|nkV”的最近距離為:n?distLn].dist?endl;
cou通過(guò)的頂點(diǎn)為:"<Vvexs[i]?M--->
for(intp=0;p<dist[n].nodenum;p++)
{cout?dist[n].way
}
cout<<vexs[n]?endl;
)
eIse
cout?vexs[i]vv“到“v<vexs沒(méi)有通路ndl;
}}}
voidMgraph::Floyd()
(
inti,j,m,n;
for(i=0;i<number;i++)
for(j=0;j<number;j++)
for(m=O;m<number;m++)
P[i][j][m]=0;
for(i=0;i<number;i++)
for(j=0;j<number;j++)
(
Darcs[i][j];
if(D[i][j]<1000)
(
P[ilU][i]=l;
P|i][J]Ej]=1;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《市場(chǎng)調(diào)查課程考核》課件
- 《電化學(xué)催化》課件
- 《小學(xué)生說(shuō)明文》課件
- 單位管理制度集合大合集【職員管理】十篇
- 單位管理制度匯編大合集【職工管理篇】
- 單位管理制度合并匯編職員管理篇
- 《淋巴結(jié)斷層解剖》課件
- 單位管理制度分享合集人事管理
- 單位管理制度范文大合集人員管理十篇
- 單位管理制度呈現(xiàn)匯編員工管理
- 肌理課件完整
- “約會(huì)”的DFMEA與PFMEA分析
- 教師朗誦稿《幸?!?7篇)
- 數(shù)據(jù)安全應(yīng)急響應(yīng)與處置
- 2023漢邦高科安防產(chǎn)品技術(shù)參數(shù)和檢測(cè)報(bào)告
- 急診課件:急性呼吸困難完整版
- 唐詩(shī)宋詞鑒賞(第二版)PPT完整全套教學(xué)課件
- 超聲診斷學(xué)-乳腺超聲診斷
- 管工初賽實(shí)操
- 門(mén)診病歷書(shū)寫(xiě)模板全
- 液壓與氣壓傳動(dòng)中職PPT完整全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論