![課程設計 單源點最短路徑算法的實現_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/b548f40e-b119-4e9e-af15-646c5d9f2531/b548f40e-b119-4e9e-af15-646c5d9f25311.gif)
![課程設計 單源點最短路徑算法的實現_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/b548f40e-b119-4e9e-af15-646c5d9f2531/b548f40e-b119-4e9e-af15-646c5d9f25312.gif)
![課程設計 單源點最短路徑算法的實現_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/b548f40e-b119-4e9e-af15-646c5d9f2531/b548f40e-b119-4e9e-af15-646c5d9f25313.gif)
![課程設計 單源點最短路徑算法的實現_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/b548f40e-b119-4e9e-af15-646c5d9f2531/b548f40e-b119-4e9e-af15-646c5d9f25314.gif)
![課程設計 單源點最短路徑算法的實現_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/b548f40e-b119-4e9e-af15-646c5d9f2531/b548f40e-b119-4e9e-af15-646c5d9f25315.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、數據結構課程設計設計說明書單源點最短路徑算法的實現學生姓名學號班級成績指導教師數學與計算機科學學院2015年 1 月 2 日 數據結構 課程設計評閱書題 目單源點最短路徑算法的實現學生姓名學 號指導教師評語及成績成 績: 教師簽名: 年 月 日教研室意見總成績: 室主任簽名: 年 月 日課程設計任務書20142015學年第1學期專業(yè): 學號: 姓名: 課程設計名稱: 數據結構課程設計 設 計 題 目: 單源點最短路徑算法的實現 完 成 期 限:自 2014 年 12 月 22 日至 2015 年 1 月 2 日共 2 周設計內容及要求:最短路徑問題已經被應用到GIS、GPS等信息管理系統(tǒng)中,為
2、人們生活帶來了很大便利。它屬于圖結構問題,其解決方法也有不少(如Dijkstra、 A-star)。單源點最短路徑問題解決的是既定起點的情況下,尋求該點到圖中其它頂點的最短路徑。請用C/C+語言的結構體、指針、數據結構等基礎知識,編寫程序實現圖的結構定義、圖的存儲,以及求解單源點最短路徑。設計過程以及寫作要求如下:(1)要針對本題目,認真研究所設計的內容,用簡明扼要的語言描述課題,給出課題的基本內容及要求;(2)根據數據結構的相關知識給出實現建立任意m個頂點n條邊的圖算法、按照用戶給定的源點和目標點,求出它們間的最短路徑(打印出來)算法的基本策略及思路;(3)給出較為詳盡數據結構與算法,算法可
3、以用流程圖、偽代碼等描述手段進行描述;(4)給出一個完整的算法實現的C/C+程序,算法中的各子算法要力求用函數來實現;(5)對編寫的程序要進行詳盡的測試分析;(6)對本課題的設計工作要進行一個完整深刻的總結。最終設計成果形式為:1、 設計軟件一套;2、 撰寫一份課程設計說明書一份,打印并裝訂成冊。指導教師(簽字): 教研室主任(簽字): 批準日期: 年 月 日摘要 本系統(tǒng)以VC+作為軟件開發(fā)環(huán)境,C語言作為程序開發(fā)語言,鄰接矩陣作為存儲結構,設計與實現了最短路徑運算。該系統(tǒng)實現了有向圖的存儲、最短路徑的運算等主要功能。依照該系統(tǒng)可以解決生活中許多問題,比如交通路線的選擇,工程時間的預算等等,讓
4、人們可以做出合理的選擇。本系統(tǒng)通過分析課題的背景、意義、要求,分別從課題描述、邏輯設計、算法設計、調試與測試等各個方面詳細介紹了系統(tǒng)的設計與實現過程,最后對系統(tǒng)的完成情況進行了總結。界面清晰,操作簡單,易于用戶接受。關鍵詞:VC+;鄰接矩陣; 最短路徑目 錄1課題描述12 問題分析與任務定義22.1問題分析22.2任務定義23 算法設計33.1 圖的鄰接矩陣的存儲結構33.2 Dijkstra算法思想44 系統(tǒng)邏輯設計54.1 主函數流程圖如圖4.1所示54.2 Create函數流程圖如圖4.2所示64.3 Dijkstra函數流程圖如圖4.3所示 85 源代碼116 調試與測試146.1合法
5、數據輸入146.2非法數據輸入15總結16參考文獻171課題描述乘車旅行的人大多數都希望找出到目的地盡可能短,花費少的行程,那么如何找出從出發(fā)點到目的地的最短路徑?由于路徑比較多,所以用手工計算起來比較復雜,抽象,因此人們用計算機語言代替手工計算來求得最短路徑。而在計算機語言中迪杰斯拉算法比較常用,簡捷,故人們經常借助計算機程序用迪杰斯拉算法求得單源點的最短路徑,這樣可以廣泛的提高效率,而且條理清晰,通俗易懂。02 問題分析與任務定義2.1問題分析 本系統(tǒng)是要解決的是單源點最短路徑問題,設計程序,實現最短路徑的求法,系統(tǒng)需要達到的主要功能如下:(1) 編寫算法能夠建立帶權圖,并能夠用Dijks
6、tra算法求該圖的最短路徑。(2) 能夠選擇圖上的任意一頂點做為開始節(jié)點。最短路徑輸出不必采用圖形方式,可頂點序列方式輸出。(3) 根據課設題目要求,擬將整體程序分為三大模塊。兩個子模塊相互獨立,沒有嵌套調用的情況,在主模塊中調用上面兩個子模塊。2.2任務定義 根據課設題目要求,擬將整體程序分為三大模塊。兩個子模塊相互獨立,沒有嵌套調用的情況,在主模塊中調用上面兩個子模塊以下是三個模塊的大體分析:(1) 建立有向圖的存儲結構。(2) 應用Dijkstra算法求出該有向圖的最短路徑。(3) 在主函數中調用兩個子函數,完成最短路徑的程序設。13 算法設計3.1 圖的鄰接矩陣的存儲結構一個圖的鄰接矩
7、陣表示唯一的。故在圖的鄰接矩陣表示中,除了需要用一個二維數組存儲頂點之間相鄰關系的鄰接矩陣外,通常還需要使用一個具有n個元素的一維數組存儲頂點信息,其中下標為i的元素存儲頂點vi的信息。本設計是基于類C語言的算法描述,因此,圖的鄰接矩陣的存儲結構定義如下:#define MVNum 50typedef struct VertexType vexsMVNum; Adjmatrix arcsMVNumMVNum;Mgraph;在本系統(tǒng)中,以鄰接矩陣存儲有向圖,如圖3.1a中有向圖G所示,其鄰接矩陣為圖 3.1b所示: 圖3.1b G的鄰接矩陣 10 30 100 5 50 10 20 60 bae
8、f550圖3.1a 有向圖G圖3.1b G的鄰接矩陣 10 30 100 5 50 10 20 60 圖3.1b G的鄰接矩陣圖3.1a 有向圖G505feabcd1006030 2010103.2 Dijkstra算法思想(1)Dijkstra算法核心是貪心,實質是按路徑長度遞增產生諸頂點的最短路徑算法。用自然語言描述如下:初始化S和D,置空最短路 徑終點集,置初始的最短路徑值;Sv1=TRUE;Dv1=0;While(S集中的頂點數<n) 開始循環(huán),每次求的v1到某個v頂點的最短路徑,并將v加到S集中; Sv=TRUE; 更新當前最短路徑及距離。(2)Dijkstra算法結束后,通過
9、設置一個數組記錄下一個節(jié)點的前趨節(jié)點,然后通過倒敘的方式輸出該最短路徑。4 系統(tǒng)邏輯設計4.1 主函數流程圖如圖4.1所示開始輸入頂點個數和邊數m,n開始輸入數據調用Create函數建立圖的鄰接矩陣調用Create函數N調用Dijkstra函數Y3.1主函數流程圖請輸入初始點v4.2 Create函數流程圖調用Dijkstra函數求得最短路徑k=1 結束圖4.1 主函數流程圖4.2 Create函數流程圖如圖4.2所示開始定義頂點序號i=1,頂點數m,邊數nNi<=mY存入一維向量G.vexsi=ii=i+1i=1Ni<=mYi=i+1j=1Nj<=mY 10 30 100
10、5 50 10 20 60 對鄰接矩陣m*m個單元初始化G.arcsij=Maxintj=j+1接下一頁接上一頁 N變量k=1k<=nY定位i,ji=a-a+1 , j=b-a+1G->arcsij=w給鄰接矩陣有關單元賦權值wG.arcsij=wk=k+1 結束圖4.2 Create函數流程圖4.3 Dijkstra函數流程圖如圖4.3所示 開始定義G中v1到其余頂點v的最短路徑、帶權長度及最短路徑終點的集合int DMVNum, PMVNum boolean SMVNum 定義頂點數 int mv=1Nv<=mY置空S Sv=FALSE Dv=G.arcsv1vN若權值小
11、于最大值 無窮Dv<MaxintYPv=0Pv=v1v=v+1初始化,v1頂點屬于s集Dv1=0;Sv1=TRUE 開始主循環(huán),每次求得v1到某個v頂點的最短路徑,并加v到s集i=2接下一頁接上一頁Ni<=mmmmY當前所知離v1頂點的最近距離min=Maxint 頂點變量w=1Nw<=m、YN!Sw&&Dw<minYv=w W頂點離v1更近min=D wSv=TRUEw=w+1w=1Nw<=mYSv=TRUEN!Sw&&Dv+G.arcsvw<DwY修改Dw,Pw Dw=Dv+G.arcsvwPw=vw=w+1i=i+1接下
12、一頁接上一頁、i=1Ni<=mmmmY輸出數據pvi=i+1結束圖4.3 Dijkstra函數流程圖 5 源代碼#include<stdio.h>#include<stdlib.h>#define MVNum 50#define Maxint 1111typedef char VertexType; / 定義頂點typedef int Adjmatrix; typedef enum FALSE,TRUEboolean;typedef struct / 圖的鄰接矩陣VertexType vexsMVNum; /頂點向量 存放頂點的一維數組Adjmatrix arcs
13、MVNumMVNum; / 鄰接矩陣二維數組MGraph; /定義鄰接矩陣結構類型void CreateMGraph(MGraph *G,int m,int n) / 采用數組(鄰接矩陣)表示法,構造圖Gint i,j,k,w;char a,b;for(i=1;i<=m;i+) /構造頂點向量G->vexsi=i;for(i=1;i<=m;i+) /初始化鄰接矩陣for(j=1;j<=m;j+)G->arcsij=Maxint;printf("輸入%d條邊的i,j及w:n",n);for(k=1;k<=n;k+) / 構造鄰接矩陣fflu
14、sh(stdin);scanf("%c,%c,%d",&a,&b,&w); /輸入一條邊依附的頂點及權值i=a-'a'+1;j=b-'a'+1; G->arcsij=w; /弧<i,j>的權值printf("有向圖的存儲結構建立完成!n");printf("*n"); void Dijkstra(MGraph G,int v1,int m)/用Dijkstra算法求G中v1頂點到其余頂點v的最短路徑pv及帶權長度Dvint DMVNum,PMVNum;int v
15、,i,w,min;boolean SMVNum;/ S以求得最短路徑的終點的集合for(v=1;v<=m;v+)Sv=FALSE;Dv=G.arcsv1v;if(Dv<Maxint)Pv=v1;elsePv=0;Dv1=0;Sv1=TRUE; / 初始化,v1頂點屬于s集 /開始主循環(huán),每次求得v1到某個v頂點的最短路徑,并加v到s集for(i=2;i<=m;i+) / 其余n-1個頂點min=Maxint; /當前所知離v1頂點的最近距離for(w=1;w<=m;w+)if(!Sw&&Dw<min) / w頂點在v-s中v=w;min=Dw; /
16、w頂點離v1頂點更近Sv=TRUE;for(w=1;w<=m;w+) /更新當前最短路徑及距離if(!Sw&&(Dv+G.arcsvw<Dw) / 修改Dw和Pw,w屬于v-sDw=Dv+G.arcsvw;Pw=v;printf("路徑長度-路徑n");for(i=1;i<=m;i+)printf("%5d",Di); printf("%12c",i-1+'a');v=Pi;while(v!=0)printf("<-%c",v-1+'a');v
17、=Pv;printf("n"); void main() MGraph G;int m,n,v;char ch;printf("輸入所需圖的頂點個數和邊數m,n:");scanf("%d,%d",&m,&n);CreateMGraph(&G,m,n); while (v<=m) printf("求最短路徑,請輸入初始點v:");fflush(stdin);scanf("%c",&ch);printf("n");v=ch-'a
18、9;+1;Dijkstra(G,v,m); 6 調試與測試6.1合法數據輸入(1)合法數據測試結果如圖6.1所示圖6.1合法數據測試結果6.2非法數據輸入(2)非法數據測試結果如圖6.2所示圖6.2非法數據測試結果當前任務已達到任務目標,對于n個頂點的有向圖,求一個頂點到其他頂點的最短路徑的時間為O(n),調整最短路徑的循環(huán)共執(zhí)行n-1次,所以,時間復雜度是O(n2)。采用鄰接矩陣存儲有向圖,應處理每兩個頂點之間的關系,所以空間復雜度為O(n2)。總結本次課程設計涉及到的范圍很廣,讓我比較系統(tǒng)的對C語言和數據結構知識進行了一次整理和復習。本系統(tǒng)存在的問題主要是程序完成后,調試時沒有發(fā)現問題,但是當輸入開始節(jié)點后,運行框卻不停的出現”<-a”,后來重新檢查程序時發(fā)現for循環(huán)的括號后面多了一個“;”,去掉該分號之后,程序可以運行。在這次課程設計中我體會到C語言超強的邏輯性以及能夠熟練使用VC+編譯環(huán)境的重要性,對C語言與數據結構這兩門課程有了新的認識,它們既有聯系,又相互區(qū)別,在編寫程序過程中要靈活應用。我對數據結構的理解還有待加強,這次課程設計應用的算法是Dijkstra算法。在學習的過程中自己對這方面的知識比較生疏,所以在算法設計過程中比較困難,尤其是設計Dij
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 統(tǒng)編版四年級下冊語文1 古詩詞三首表格式公開課一等獎創(chuàng)新教案(3課時)
- 中國農業(yè)大學《數控技術》2023-2024學年第二學期期末試卷
- 統(tǒng)編版語文六年級下冊 第二單元 快樂讀書吧漫步世界名著花園+公開課一等獎創(chuàng)新教學設計
- 青島工學院《人體工程學》2023-2024學年第二學期期末試卷
- 寧波職業(yè)技術學院《營銷概論》2023-2024學年第二學期期末試卷
- 南京師范大學《生物科學動態(tài)專題》2023-2024學年第二學期期末試卷
- 黃淮學院《管理學研究方法與統(tǒng)計軟件》2023-2024學年第二學期期末試卷
- 黑龍江工業(yè)學院《橋梁施工技術》2023-2024學年第二學期期末試卷
- 武威職業(yè)學院《運營案例分析》2023-2024學年第二學期期末試卷
- 2025年同位素檢測裝置合作協(xié)議書
- 加強網絡空間治理工作的調研與思考
- 產后修復學習培訓課件
- 高考志愿咨詢培訓課件
- mysql課件第五章數據查詢
- 超濾培訓課件
- 熱線電話管理制度
- 《海峽兩岸經濟合作框架協(xié)議》全文
- 紡絲原液制造工(中級)理論考試復習題庫(含答案)
- ArcGIS軟件入門培訓教程演示文稿
- 大梅沙河道河道流量水位
- 人教版初二英語八年級上冊全冊英語單詞表
評論
0/150
提交評論