版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
頁摘要在交通網絡非常發(fā)達,交通工具和交通方式不斷更新的今天,人們在出行時,不僅關心節(jié)省交通費用,而且對里程和所需時間等問題也感興趣。對于們關心的問題,可用一個圖結構和表示交通網絡系統,利用計算機建立一個交通咨詢系統。關鍵詞:交通網絡,鄰接矩陣,最短路徑。
前言圖是一種復雜的非線性結構。在人工智能,工程,數學,物理,化學,計算機學科等領域中,圖結構有著廣泛的應用。我們用最短路徑問題,用一個人們熟悉的交通咨詢系統實例來驗證迪杰斯特拉算法和費洛伊德得算法。我們在對一些問題進行求解時,會發(fā)現有些問題很難找到規(guī)律,或者根本無規(guī)律可尋。對于這樣的問題,可以利用計算機運算速度快的特點,先搜索查找所有可能出現的情況,再根據題目條件從所有可能的情況中,刪除那些不符合條件的解。設計一個蘭州道路交通咨詢系統,能讓人們咨詢從任一個地方頂點到另一地方頂點之間的最短路徑。在計算機中,有多種方法存儲圖的信息,由于圖的結構復雜,使用廣泛,一般應根據實際的應用,選擇適合的表示方法。常用的圖的存儲結構有鄰接矩陣、鄰接多重表和鄰接表。
正文采用類c語言定義相關的數據類型采用鄰接矩陣定義圖typedefstruct{VertexTypevexs[MVNum];//頂點數組,類型假定為char型Adjmatrixarcs[MVNum][MVNum];//鄰接矩陣,假定為int型}MGraph;建立圖的存儲結構#include<stdio.h>#include<stdlib.h>#defineMVNum100//最大頂點數#defineMaxint32767enumboolean{FALSE,TRUE};typedefcharVertexType;typedefintAdjmatrix;typedefstruct{VertexTypevexs[MVNum];//頂點數組,類型假定為char型Adjmatrixarcs[MVNum][MVNum];//鄰接矩陣,假定為int型}MGraph;
各模塊的偽碼算法(1)迪杰斯特拉算法的實現voidDijkstra(MGraph*G,intv1,intn){//用Dijkstra算法求有向圖G的v1頂點到其他頂點v的最短路徑P[v]及其權D[v]//設G是有向圖的鄰接矩陣,若邊〈i,j〉不存在,則G[i][j]=Maxint//S[v]為真當且僅當v∈S,即已求得從v1到v的最短路徑intD2[MVNum],P2[MVNum];v,i,w,min;enumbooleanS[MVNum];for(v=1;v<=n;v++){//初始化S和DS[v]=FALSE;//置空最短路徑終點集D2[v]=G->arcs[v1][v];//置初始的最短路徑值if(D2[v]<Maxint)P2[v]=v1;//v1是v的前趨(雙親)elseP2[v]=0;//v無前趨}D2[v1]=0;S[v1]=TRUE;//S集初始時只有源點,源點到源點的距離為0//開始循環(huán),每次求得v1到某個v頂點的最短路徑,并加v到s集中for(i=2;i<n;i++){//其余n-1個頂點min=Maxint;for(w=1;w<=n;w++)if(!S[w]&&D2[w]<min){v=w;min=D2[w];}//w頂點離v1頂點更近S[v]=TRUE;for(w=1;w<=n;w++)//更新當前最短路徑及距離if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){D2[w]=D2[v]+G->arcs[v][w];P2[w]=v;}//End_if}//End_forprintf("lujingchangdulujing\n");for(i=1;i<=n;i++){printf("%5d",D2[i]);printf("%5d",i);v=P2[i];while(v!=0){printf("<-%d",v);v=P2[v];}printf("\n");}}(2)費洛伊德得算法的實現voidFloyd(MGraph*G,intn){intD[MVNum][MVNum],P[MVNum][MVNum];i,j,k,v,w;for(i=1;i<=n;i++)//設置路徑長度D和路徑path初值for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)P[i][j]=j;//j是i的后繼else P[i][j]=0; D[i][j]=G->arcs[i][j];}for(k=1;k<=n;k++) {for(i=1;i<=n;i++)//做k次迭代,每次均試圖將頂點k擴充到當前求得的從i到j的最短路徑Pij上 for(j=1;j<=n;j++) {if(D[i][k]+D[k][j]<D[i][j]){ D[i][j]=D[i][k]+D[k][j];//修改長度 P[i][j]=P[i][k]; }}}}
3.函數的調用關系圖主函數主函數main調用費洛伊德算法voidFloyd調用費洛伊德算法voidFloyd創(chuàng)建圖VoidMGraph調用迪杰斯特拉算法voidDijkstra調用迪杰斯特拉算法voidDijkstra打印圖的鄰接矩陣VoidMGraph
4.調試分析a、調試中遇到的問題及對問題的解決方法在輸入頂點和邊數時,要注意輸入的格式,如果在編寫程序時用的輸入方式是“,”,則在輸入頂點和邊數時必須用逗號將兩個數值隔開,如要輸入5和3,則正確的輸入方式是:5,3。如果輸入出現錯誤,則會出現死循環(huán)。b、算法的時間復雜度和空間復雜度時間復雜度:創(chuàng)建圖并以鄰接矩陣存儲的時間復雜度為O(n)迪杰斯特拉算法的時間復雜度O(n3)費洛伊德得算法的時間復雜度O(n3)
5.測試結果abgcabgcfed蘭州道路交通網圖91020181581053012一個有向圖因為在算法中,為了操作方便,對于圖的頂點都是用序號來表示的,所以頂點的字母就用其對應的序號來操作a(1),b(2),c(3),d(4),e(5),f(6),g(7)。(1)圖的鄰接矩陣#defineM20#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedefstruct{intV[M];intR[M][M];intvexnum;}MGraph;voidcreatgraph(MGraph*G,intn){inti,j,r1,r2;g->vexnum=n;for(i=1;i<=n;i++){g->V[i]=i;}for(i=1;i<=n;i++)for(j=1;j<=n;j++){g->R[i][j]=0;}printf("PleaseinputR(0,0END):\n");scanf("%d,%d",&r1,&r2);while(r1!=0&&r2!=0){g->R[r1][r2]=1;g->R[r2][r1]=1;scanf("%d,%d",&r1,&r2);}}voidprintgraph(MGraph*G){inti,j;for(i=1;i<=g->vexnum;i++){for(j=1;j<=g->vexnum;j++){printf("%2d",g->R[i][j]);}printf("\n");}}main(){intn;MGraph*G=(MGraph*)malloc(sizeof(MGraph));charmenu;printf("Pleaseinputthenumberofvertex:\n");scanf("%d",&n);creatgraph(g,n);printf("Thisisthelinjiejuzhenofgraph:\n");printgraph(g);}(2)求兩個頂點之間的最短路徑和求兩個頂點之間是否有路徑存在:
6.源程序(帶注釋)#include<stdio.h>#include<stdlib.h>#defineMVNum100//最大頂點數#defineMaxint32767enumboolean{FALSE,TRUE};typedefcharVertexType;typedefintAdjmatrix;typedefstruct{VertexTypevexs[MVNum];//頂點數組,類型假定為char型Adjmatrixarcs[MVNum][MVNum];//鄰接矩陣,假定為int型}MGraph;voidCreateMGraph(MGraph*G,intn,inte){//采用鄰接矩陣表示法構造有向圖G,n,e表示圖的當前頂點數和邊數intarcs[MVNum][MVNum];inti,j,k,w;for(i=1;i<=n;i++)G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint;//初始化鄰接矩陣printf("shuru%dtiaobiandei,j,w:\n",e);for(k=1;k<=e;k++){//讀入e條邊,建立鄰接矩陣scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("youxiangtudecunchujiegoujianliwanbi!\n");}voidDijkstra(MGraph*G,intv1,intn){//用Dijkstra算法求有向圖G的v1頂點到其他頂點v的最短路徑P[v]及其權D[v]//設G是有向圖的鄰接矩陣,若邊〈i,j〉不存在,則G[i][j]=Maxint//S[v]為真當且僅當v∈S,即已求得從v1到v的最短路徑intD2[MVNum],P2[MVNum];intv,i,w,min;enumbooleanS[MVNum];for(v=1;v<=n;v++){//初始化S和DS[v]=FALSE;//置空最短路徑終點集D2[v]=G->arcs[v1][v];//置初始的最短路徑值if(D2[v]<Maxint)P2[v]=v1;//v1是v的前趨(雙親)elseP2[v]=0;//v無前趨}D2[v1]=0;S[v1]=TRUE;//S集初始時只有源點,源點到源點的距離為0//開始循環(huán),每次求得v1到某個v頂點的最短路徑,并加v到s集中for(i=2;i<n;i++){//其余n-1個頂點min=Maxint;for(w=1;w<=n;w++)if(!S[w]&&D2[w]<min){v=w;min=D2[w];}//w頂點離v1頂點更近S[v]=TRUE;for(w=1;w<=n;w++)//更新當前最短路徑及距離if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){D2[w]=D2[v]+G->arcs[v][w];P2[w]=v;}//End_if}//End_forprintf("lujingchangdulujing\n");for(i=1;i<=n;i++){printf("%5d",D2[i]);printf("%5d",i);v=P2[i];while(v!=0){printf("<-%d",v);v=P2[v];}printf("\n");}}voidFloyd(MGraph*G,intn){intD[MVNum][MVNum],P[MVNum][MVNum];inti,j,k,v,w;for(i=1;i<=n;i++)//設置路徑長度D和路徑path初值for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)P[i][j]=j;//j是i的后繼else P[i][j]=0; D[i][j]=G->arcs[i][j];}for(k=1;k<=n;k++) {for(i=1;i<=n;i++)//做k次迭代,每次均試圖將頂點k擴充到當前求得的從i到j的最短路徑Pij上 for(j=1;j<=n;j++) {if(D[i][k]+D[k][j]<D[i][j]){ D[i][j]=D[i][k]+D[k][j];//修改長度 P[i][j]=P[i][k]; }}}}intD1[MVNum],P1[MVNum];intD[MVNum][MVNum],P[MVNum][MVNum];voidmain(){MGraph*G;intm,n,e,v,w,k;intxz=1;G=(MGraph*)malloc(sizeof(MGraph));printf("shurutuzhongdingdiangeshuhebianshun,e:");scanf("%d,%d",&n,&e);CreateMGraph(G,n,e);//建立圖的存儲結構while(xz!=0){printf("*****qiudefangzhijiandezuiduanlujing*****\n");printf("==============================\n");printf("1,qiuyigedefangdaosuoyoudefangdezuiduanlujing\n");printf("2,qiurenyilianggedefangzhijiandezuiduanlujing\n");printf("===============================\n");printf("qingxuanze:1or2,xuanze0exit:");scanf("%d",&xz);if(xz==2){Floyd(G,n);//調用費洛伊德算法printf("shuruqidianhezhongdian:v,w:");scanf("%d,%d",&v,&w);k=P[v][w];if(k==0)printf("dingdian%ddao%dwulujing!\n",v,w);else{printf("congdingdian%ddao%ddezuiduanlujingshi:%d",v,w,v);while(k!=w){printf("->%d",k);//輸出后繼頂點k=P[k][w];//繼續(xù)找下一個后繼頂點}printf("->%d",w);//輸出終點wprintf("lujingchangdu:%d\n",D[v][w]);}}elseif(xz==1){printf("qiudanyuanlujing,shuruqidianv:");scanf("%d",&v);Dijkstra(G,v,n);//調用迪杰斯特拉算法}}printf("jieshuqiuzuiduanlujing,byebye!\n");}
總結在這三周的數據結構課程設計中,我的題目是:蘭州道路交通網絡信息查詢,這三周課程設計中,通過該題目的設計過程,我加深了對圖的建立和對迪杰斯特拉算法以及費洛伊德算法的理解,對課本中所學的各種數據結構進一步理解和掌握,學會了如何把學到的知識用于解決實際問題,鍛煉了自己動手的能力。一個人要完成所有的工作是非常困難和耗時的。在以后的學習中我會更加注意各個方面的能力的協調發(fā)展。在課程設計時遇到了很多的問題,在老師的幫助,和對各種資料的查閱中,將問題解決,培養(yǎng)了我自主動手,獨立研究的能力,為今后在學習工作中能更好的發(fā)展打下了堅實的基礎。三周的課程設計很短暫,但其間的內容是很充實的,在其中我學習到了很多平時書本中無法學到的東西,積累了經驗,鍛煉了自己分析問題,解決問題的能力,并學會了如何將所學的各課知識融會,組織,來配合學習,三周中我收益很大,學到很多。
參考文獻嚴蔚敏,陳文博編
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《園林樹木》課程標準
- 2BizBoxERP用戶基礎手冊
- 三角形的翻折課件
- 第1單元 古代亞非文明(高頻選擇題50題)(原卷版)
- 2024年農業(yè)和農村檔案工作總結
- 七年級下《保護野生動物》蘇教版-課件
- 農業(yè)科創(chuàng):研發(fā)力量展示
- 機場服務行業(yè)銷售工作總結
- 資金借貸合同個人醫(yī)療保健費用貸款支出租賃保險三篇
- 初一生物教學工作總結實踐探索培養(yǎng)動手能力
- 2024-2030年中國汽車水泵市場未來發(fā)展趨勢及前景調研分析報告
- 綠城營銷策劃管理標準化手冊
- 2025小學創(chuàng)意特色寒假素養(yǎng)作業(yè)設計真絕了【高清可打印】
- 2025年上半年河南安陽市睢陽區(qū)“減縣補鄉(xiāng)”鄉(xiāng)鎮(zhèn)事業(yè)單位選拔130人重點基礎提升(共500題)附帶答案詳解
- 2025學年學期學校衛(wèi)生工作計劃
- 10.1.2事件的關系和運算(教學課件)高一數學(人教A版2019必修第二冊)
- 2024-2030年中國天然靛藍行業(yè)市場規(guī)模預測及發(fā)展可行性分析報告
- 2024年可行性研究報告投資估算及財務分析全套計算表格(含附表-帶只更改標紅部分-操作簡單)
- 企業(yè)EHS風險管理基礎智慧樹知到期末考試答案2024年
- 2024全國職業(yè)院校技能大賽ZZ060母嬰照護賽項規(guī)程+賽題
- 商票保貼協議
評論
0/150
提交評論