版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 軟件設(shè)計(jì)基礎(chǔ)課程設(shè)計(jì)</p><p> 題 目: 從某個(gè)源點(diǎn)到其余各頂點(diǎn)的最短路徑 </p><p> 學(xué) 院: 信息與通信工程學(xué)院 </p><p> 專 業(yè): 通信工程專業(yè)
2、 </p><p> 學(xué)生姓名: </p><p> 班級(jí)/學(xué)號(hào): </p><p> 指導(dǎo)老師:
3、 </p><p> 起止時(shí)間: 2013-9-22 至 2013-11-6 </p><p><b> 摘要 </b></p><p> 本次課程設(shè)計(jì)的問題:假設(shè)西安、北京、沈陽、武漢4個(gè)城市構(gòu)成小型交通網(wǎng),4個(gè)城市表示圖的4個(gè)頂點(diǎn),它們構(gòu)成了無
4、向連通圖。以北京為源點(diǎn),求北京到西安的最短路徑;求北京到沈陽的最短路徑;北京到武漢的最短路徑。</p><p> 本次課程設(shè)計(jì)中應(yīng)用Dijkstra算法求最短路徑。通過一個(gè)圖的權(quán)值矩陣求出它的每兩點(diǎn)間的最短路徑矩陣,從圖的帶權(quán)鄰接矩陣arcs(n×n)開始,遞歸地進(jìn)行n次更新,按一個(gè)公式,構(gòu)造出矩陣S(1),又用同樣的公式由S(1)構(gòu)造出S(2)…最后又用同樣的公式由S(n-1)構(gòu)造出矩陣S(n)。矩
5、陣S(n)的i行j列元素便是i號(hào)頂點(diǎn)到j(luò)號(hào)頂點(diǎn)的最短路徑長度,稱S(n)為圖的距離矩陣,同時(shí)還可引入一個(gè)后繼節(jié)點(diǎn)矩陣p[j][k]來記錄兩點(diǎn)間的最短路徑。</p><p> 本次試驗(yàn)進(jìn)行的是無向的計(jì)算,不同城市之間的距離由開始進(jìn)行輸入,最后顯示兩個(gè)城市之間的最短路徑。</p><p><b> 目錄</b></p><p><b>
6、; 任務(wù)書1</b></p><p><b> 摘要2</b></p><p><b> 目錄3</b></p><p><b> 正文4</b></p><p> 一、應(yīng)用迪科斯徹(Dijkstra)算法計(jì)算最短路徑4</p>&
7、lt;p> 二、Dijkstra 求最短路徑的基本思想4</p><p> 三、Dijkstra 求最短路徑的步驟4</p><p><b> 四、程序說明5</b></p><p><b> 五、功能實(shí)現(xiàn)5</b></p><p> 六、程序設(shè)計(jì)(二)12</p&g
8、t;<p> 七、課程設(shè)計(jì)總結(jié)16</p><p><b> 參考文獻(xiàn)17</b></p><p><b> 源代碼18</b></p><p> 應(yīng)用迪科斯徹(Dijkstra)算法計(jì)算最短路徑</p><p> 假設(shè)西安、北京、沈陽、武漢4個(gè)城市構(gòu)成小型交通網(wǎng),4個(gè)
9、城市表示圖的4個(gè)頂點(diǎn),他們構(gòu)成了無向連通圖。以北京為源點(diǎn),求北京到西安的最短路徑;求北京到沈陽的最短路徑;求北京到武漢的最短路徑。</p><p> 這里路徑指兩頂點(diǎn)間的通路,路徑的長度指所有經(jīng)過的邊的總長?!白疃搪窂健钡膯栴}指當(dāng)兩個(gè)頂點(diǎn)間通路多于一條時(shí),如何找出邊長總和為最短的那條。Dijkstra提出按路徑長度遞增的次序求最短路徑的方法。</p><p> Dijkstra 求最短
10、路徑的基本思想</p><p> 把頂點(diǎn)分成兩組,第一組是已確定最短路徑的結(jié)點(diǎn)的集合,第二組是尚未確定最短路徑的結(jié)點(diǎn)的集合。按路徑長度遞增的次序逐個(gè)把第二組的頂點(diǎn)放到第一組中。設(shè)求從v0到其它各頂點(diǎn)間的最短路徑,則在任意時(shí)刻,從v0到第一組各頂點(diǎn)間的最短路徑都不大于從v0到第二組各頂點(diǎn)間的最短路徑。 </p><p> Dijkstra 求最短路徑的步驟 </p><
11、;p> 設(shè)圖以鄰接矩陣arcs存儲(chǔ),矩陣中各元素的值為各邊的權(quán)值。頂點(diǎn)到自身的權(quán)值用0表示,頂點(diǎn)間無邊時(shí)其對應(yīng)權(quán)值用-1表示。從頂點(diǎn)v0到其它各頂點(diǎn)間的最短路徑的具體步驟如下: </p><p> (1)初始化:第一組(集合s)只含頂點(diǎn)v0,第二組(集合v-s)含有圖中其余頂點(diǎn)。設(shè)一D向量,其下標(biāo)是各頂點(diǎn),元素值是頂點(diǎn)v0到各頂點(diǎn)的邊的權(quán)值。若v0到某頂點(diǎn)無邊,D向量中的對應(yīng)值為-1。 </p&g
12、t;<p> ?。?)選D中最小的權(quán)值,將其頂點(diǎn)(j)加入s集合。 </p><p><b> s=s {j} </b></p><p> ?。?)修改從頂點(diǎn)v0到集合t(t=V-s)中各頂點(diǎn)的最短路徑長度,如果 </p><p> D[j]+arcs[j][k]<D[k] </p><p>&l
13、t;b> 則修改D[k]為</b></p><p> D[k]=D[j]+arcs[j][k] </p><p> (4) 重復(fù)(2)、(3)n-1次。由此求得v0到圖上其余各頂點(diǎn)得最短路徑。</p><p><b> 程序說明</b></p><p> 為了編程方便,以V0代表北京,V1代表
14、西安,V2代表沈陽,V3代表武漢。</p><p> 首先輸入兩點(diǎn)之間的距離,即為矩陣中各元素的值。頂點(diǎn)到自身的權(quán)值用0表示,頂點(diǎn)間無邊時(shí)其對應(yīng)權(quán)值用-1表示。</p><p><b> 功能實(shí)現(xiàn)</b></p><p><b> 1)測試1:</b></p><p><b> 假
15、設(shè):</b></p><p> V0~V1之間距離是5;</p><p> V0~V2之間距離是8;</p><p> V0~V3之間距離是9;</p><p> V1~V2之間距離是2;</p><p> V1~V3之間距離是3;</p><p> V2~V3之間距離是
16、1。</p><p><b> 如圖:</b></p><p><b> 圖的鄰接矩陣如下:</b></p><p><b> 運(yùn)行程序:</b></p><p> 運(yùn)行程序出現(xiàn)如下界面,按照事先假設(shè)的數(shù)據(jù)輸入。</p><p> 、輸入數(shù)據(jù)之
17、后,程序給出所求的鄰接矩陣、最短路徑、最短距離。</p><p><b> 結(jié)果分析:</b></p><p> 根據(jù)程序的運(yùn)行結(jié)果,我們可知:</p><p> 、V0到V0的最短路徑的距離為:0</p><p> 路徑:V0 V0</p><p> 、V0到V1的最短路徑
18、的距離為:5</p><p> 路徑:V0 V1</p><p> 、V0到V2的最短路徑的距離為:7</p><p> 路徑:V0 V1 V2</p><p> 、V0到V3的最短路徑的距離為:8</p><p> 路徑:V0 V1 V3</
19、p><p><b> 2)測試2:</b></p><p><b> 假設(shè):</b></p><p> V0~V1之間不連通;</p><p> V0~V2之間不連通;</p><p> V0~V3之間距離是7;</p><p> V1~V2之
20、間距離是2;</p><p> V1~V3之間距離是5;</p><p> V2~V3之間距離是2。</p><p><b> 如圖:</b></p><p><b> 圖的鄰接矩陣如下:</b></p><p><b> 運(yùn)行程序:</b>&
21、lt;/p><p> 運(yùn)行程序出現(xiàn)如下界面,按照事先假設(shè)的數(shù)據(jù)輸入。</p><p> 、輸入數(shù)據(jù)之后,程序給出所求的鄰接矩陣、最短路徑、最短距離。</p><p><b> 結(jié)果分析:</b></p><p> 根據(jù)程序的運(yùn)行結(jié)果,我們可知:</p><p> 、V0到V0的最短路徑的距離
22、為:0</p><p> 路徑:V0 V0</p><p> 、V0到V1的最短路徑的距離為:11</p><p> 路徑:V0 V3 V2 V1</p><p> 、V0到V2的最短路徑的距離為:9</p><p> 路徑:V0 V3
23、 V2</p><p> 、V0到V3的最短路徑的距離為:7</p><p> 路徑:V0 V3</p><p><b> 3)測試3:</b></p><p><b> 假設(shè):</b></p><p> V0~V1之間不連通;</p>&
24、lt;p> V0~V2之間距離是3;</p><p> V0~V3之間距離是9;</p><p> V1~V2之間距離是2;</p><p> V1~V3之間距離是3;</p><p> V2~V3之間不連通。</p><p><b> 如圖:</b></p>&l
25、t;p><b> 圖的鄰接矩陣如下:</b></p><p><b> 運(yùn)行程序:</b></p><p> 運(yùn)行程序出現(xiàn)如下界面,按照事先假設(shè)的數(shù)據(jù)輸入。</p><p> 、輸入數(shù)據(jù)之后,程序給出所求的鄰接矩陣、最短路徑、最短距離。</p><p><b> 結(jié)果分析:
26、</b></p><p> 根據(jù)程序的運(yùn)行結(jié)果,我們可知:</p><p> 、V0到V0的最短路徑的距離為:0</p><p> 路徑:V0 V0</p><p> 、V0到V1的最短路徑的距離為:5</p><p> 路徑:V0 V2 V1 &
27、lt;/p><p> 、V0到V2的最短路徑的距離為:3</p><p> 路徑:V0 V2 </p><p> 、V0到V3的最短路徑的距離為:8</p><p> 路徑:V0 V2 V1 V3</p><p><b> 程序設(shè)計(jì)(二)
28、</b></p><p> 編寫一個(gè)求素?cái)?shù)函數(shù),把它書寫成一個(gè)動(dòng)態(tài)鏈接庫形式,并在主函數(shù)中調(diào)用它。嘗試把自己編寫的程序?qū)懗蓜?dòng)態(tài)鏈接庫和靜態(tài)鏈接庫形式,并比較以下三種EXE文件的大小。</p><p> A:調(diào)用靜態(tài)鏈接庫生成的EXE執(zhí)行文件。</p><p> B:調(diào)用動(dòng)態(tài)鏈接庫生成的EXE執(zhí)行文件。</p><p> C
29、:直接調(diào)用函數(shù)生成的EXE執(zhí)行文件。</p><p><b> 1)、動(dòng)態(tài)連接</b></p><p> ?、佟⑿陆?xiàng)目 “Win32 Dynamic-Link Library” 項(xiàng)目名稱“sushu”,然后新建一個(gè)“sushu.cpp”文件,輸入以下代碼。</p><p> 動(dòng)態(tài)連接DLL代碼:</p><p>
30、 ②、新建一個(gè)空的工程,項(xiàng)目名稱“sushu”。然后新建一個(gè)“sushu.cpp”文件,文件代碼如下。</p><p> 然后把剛才項(xiàng)目生成的 .lib、.dll文件拷貝到該工程的debug目錄下。</p><p> 動(dòng)態(tài)連接DLL調(diào)用代碼:</p><p><b> 、運(yùn)行結(jié)果:</b></p><p><
31、b> 2)、靜態(tài)連接</b></p><p> ①、新建項(xiàng)目 “Win32 Dynamic-Link Library” 項(xiàng)目名稱“sushu”,然后新建一個(gè)“sushu.h”文件,輸入第一張圖片代碼。再新建一個(gè)“sushu.cpp”文件,輸入第二張圖片代碼。</p><p> 靜態(tài)連接DLL代碼:</p><p> ?、凇⑿陆ㄒ粋€(gè)空的工程,項(xiàng)
32、目名稱“sushu”。然后新建一個(gè)“sushu.cpp”文件,文件代碼如下。</p><p> 然后把剛才項(xiàng)目生成的 .lib、.dll文件拷貝到該工程的debug目錄下。</p><p> 靜態(tài)連接DLL調(diào)用代碼:</p><p><b> ③、運(yùn)行結(jié)果:</b></p><p><b> 3)、結(jié)果
33、分析</b></p><p> 靜態(tài)鏈接庫:lib中的指令被直接包含在最終生成的EXE文件中。</p><p> 動(dòng)態(tài)鏈接庫:dll不必被包含在最終的EXE中,EXE文件執(zhí)行時(shí)可以動(dòng)態(tài)地引用和卸載DLL文件。</p><p> 所以,調(diào)用靜態(tài)鏈接庫生成的EXE執(zhí)行文件要比調(diào)用動(dòng)態(tài)鏈接庫生成的EXE執(zhí)行文件大。</p><p>
34、;<b> 課程設(shè)計(jì)總結(jié)</b></p><p> 1、通過課程設(shè)計(jì),我學(xué)會(huì)了如何建立圖的鄰接表,理解了圖的基本概念。</p><p> 3、通過課程設(shè)計(jì),我學(xué)會(huì)了如何編寫DLL函數(shù)。</p><p> 4、能根據(jù)自己構(gòu)建的連通圖,利用Dijkstra算法求出從某個(gè)源點(diǎn)到其余各頂點(diǎn)的最短路徑。</p><p>
35、 5、掌握了C++編程環(huán)境的基本調(diào)試方法,能熟練的使用可視化C++編程工具。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 譚浩強(qiáng). C程序設(shè)計(jì)(第二版)[M]. 北京:清華大學(xué)出版社, 1999.</p><p> [2] 張青山. Dijkstra算法詳細(xì)講解[M]. 上海:復(fù)旦大學(xué)出版社, 2005.<
36、;/p><p> [3] 羅慧琴. VC++動(dòng)態(tài)鏈接庫(DLL)編程深入淺出[M]. 陜西:西安電子科技大學(xué)出版社, 2003.</p><p> [4] 嚴(yán)蔚敏, 吳偉民. 數(shù)據(jù)結(jié)構(gòu)[M]. 北京:清華大學(xué)出版社, 2005.</p><p> /* 用鄰接矩陣表示的圖的Dijkstra算法的源程序——*/</p><p> #incl
37、ude <stdio.h></p><p> #include <limits.h></p><p> #define Max INT_MAX</p><p> #define MAXVEX 4</p><p> #define FALSE 0</p><p> #define TRU
38、E 1</p><p> typedef struct</p><p><b> { </b></p><p> int num; /* 圖的頂點(diǎn)個(gè)數(shù) */</p><p> char vexs[MAXVEX]; /*
39、頂點(diǎn)信息 */</p><p> float arcs[MAXVEX][MAXVEX]; /* 邊信息 */</p><p> }Tu; /* 定義結(jié)構(gòu)體Tu類型 */</p><p> void ShortestPath(Tu &G,int p[][MAXVEX],float D[])</p><p
40、><b> { </b></p><p> int v,w,i,j;</p><p> float min;</p><p> int final[MAXVEX]; //final[v]為TRUE當(dāng)且僅當(dāng)v∈s,即已求得從v0到v的最短路徑</p><p> for(i=0;i<G.num;i
41、++)</p><p> { final[i]=FALSE; </p><p> D[i]=G.arcs[0][i];</p><p> for(w=0;w<G.num;w++) p[i][w]=FALSE; /*設(shè)空路徑*/</p><p> if(D[i]!=-1) /*如果V0到Vi有直接路徑則置p[i
42、][0]和p[i][i]為1*/</p><p> { p[i][0]=TRUE;</p><p> p[i][i]=TRUE;</p><p><b> }</b></p><p> }/*for語句結(jié)束*/</p><p> final[0]=TRUE; /* 初始化,表
43、示頂點(diǎn)v0在集合S中 */</p><p> for(i=1;i<G.num;i++) /*開始主循環(huán),每次求得v0到某個(gè)v頂點(diǎn)的最短路徑,并加v到s集*/</p><p><b> {</b></p><p> min=Max; /* 初始化,表示最短距離min的初始值為無窮大 */</p>
44、<p> for(w=0;w<G.num;w++) /*在V-S中選出距離值最小頂點(diǎn)*/</p><p> if((!final[w]&&D[w]<min)&&(D[w]!=-1)) /*w頂點(diǎn)離v0頂點(diǎn)是更近*/</p><p> { v=w; min=D[w]; } </p><p>
45、 final[v]=TRUE; /*離v0最近的v加入S集*/</p><p> for(w=0;w<G.num;w++) /*更新當(dāng)前最短路徑及距離*/</p><p> if(G.arcs[v][w]!=-1) /*假如v到w之間相通,則執(zhí)行下一步*/</p><p> {if(!fina
46、l[w]&&((min+G.arcs[v][w]<D[w])||D[w]==-1)) /*修改D[w]和p[w],w∈v-S*/</p><p> {D[w]=min+G.arcs[v][w]; /*修改路徑長度*/</p><p> for(j=0;j<G.num;j++)p[w][j]=p[v][j]; /*修
47、改路徑為經(jīng)過v到達(dá)w*/</p><p> p[w][w]=TRUE;}</p><p> }/*if結(jié)束*/ </p><p> }/*for結(jié)束*/</p><p> }/*ShortestPath結(jié)束*/</p><p> void main()</p><p><b>
48、; { </b></p><p> printf("\n*************************************************\n");/*輸出提示信息*/</p><p> printf(" V0 代表 北京\n");</p><p> pri
49、ntf(" V1 代表 西安\n");</p><p> printf(" V2 代表 沈陽\n");</p><p> printf(" V3 代表 武漢\n");</p><p> printf(&quo
50、t;*************************************************\n\n");</p><p><b> int i,j;</b></p><p><b> Tu G;</b></p><p> float D[MAXVEX]; /*D(v)為v0
51、到v的路徑長度*/</p><p> int p[MAXVEX][MAXVEX]; /*p(v)記錄v0到v的最短路徑,若p[v][w]為TRUE,則w是從v0到v當(dāng)前求得最短路徑上的頂點(diǎn)*/</p><p> G.num=4; /*一共有四個(gè)城市*/</p><p> for(i=0;i<G.num;i++) /*
52、for循環(huán)輸入四個(gè)城市之間的距離*/</p><p><b> {</b></p><p> for(j=0;j<G.num;j++)</p><p><b> {</b></p><p> if(i==j) /*假如i等于j,表示該城市到自身的距離,置為0*/&l
53、t;/p><p> G.arcs[i][j]=0;</p><p><b> else{</b></p><p><b> if(j>i)</b></p><p><b> {</b></p><p> printf(" 請
54、輸入");</p><p> printf("V%d",i); </p><p> printf("到");</p><p> printf("V%d",j); </p><p> printf("的距離 (不通請輸入-1)\n "
55、);</p><p> scanf("%f",&G.arcs[i][j]);</p><p> G.arcs[j][i]=G.arcs[i][j]; /*該圖為無向圖,所以i到j(luò)的距離即為j到i的距離*/</p><p> }/*if結(jié)束*/ </p><p> } /*else結(jié)束*/ &l
56、t;/p><p> }/*for結(jié)束*/ </p><p> }/*for結(jié)束*/ </p><p> ShortestPath(G,p,D); /*代入數(shù)據(jù)求解最短距離*/ </p><p> printf("\n以鄰接矩陣的形式表示圖為:\n"); /*以鄰接矩陣形式輸出圖*/</
57、p><p> for(i=0;i<G.num;i++) </p><p> { for(j=0;j<G.num;j++)</p><p> printf("%12.0f",G.arcs[i][j]);</p><p> printf("\n");</p>
58、<p><b> }</b></p><p> printf("\nV0到其它各頂點(diǎn)的路徑表示為:\n"); /*輸出V0到其它各頂點(diǎn)的路徑*/</p><p> for(i=0;i<G.num;i++) </p><p> { for(j=0;j<G.num;j++)
59、</p><p> printf("%12d",p[i][j]);</p><p> printf("\n");</p><p><b> }</b></p><p> printf("\nV0到其它各頂點(diǎn)的最短距離為:\n"); /*輸出V0到其它
60、各頂點(diǎn)的最短距離*/</p><p> for(i=0;i<G.num;i++) </p><p> { printf(" V0 到");</p><p> printf(" V%d ",i);</p><p> printf("的最短路
61、徑的距離為:");</p><p> printf("%.0f\n",D[i]);</p><p><b> }</b></p><p> printf("\n \n");</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖頂點(diǎn)間最短路徑算法
- 課程設(shè)計(jì)--最短路徑拯救007
- 課程設(shè)計(jì)-故宮導(dǎo)游咨詢設(shè)計(jì)(最短路徑)
- 課程設(shè)計(jì)報(bào)告---最短路徑求最大利潤
- 單元點(diǎn)最短路徑算法的實(shí)現(xiàn)課程設(shè)計(jì)
- 最短路徑--拯救007課程設(shè)計(jì)
- 通信網(wǎng)最短路徑課程設(shè)計(jì)--基于c語言對d算法最短路徑的求解
- 數(shù)據(jù)結(jié)構(gòu),課程設(shè)計(jì),校園最短路徑問題
- a算法的改進(jìn)課程設(shè)計(jì)--a最短路徑算法的改進(jìn)
- 最短路徑問題―――螞蟻爬行的最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--dijkstra算法求最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---交通旅游圖的最短路徑問題
- 最短路徑問題--教學(xué)設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--弗洛伊德算法與最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--可視化弗洛伊德最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--用c#語言解決最短路徑的問題
- 最短路徑學(xué)年論文
- 最短路徑問題(經(jīng)典)
- 最短路徑規(guī)劃研究
- 最短路徑問題(經(jīng)典)
評(píng)論
0/150
提交評(píng)論