版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程名稱: 數(shù)據(jù)結(jié)構(gòu) </p><p> 設(shè)計(jì)題目: 最短路徑求最大利潤 </p><p> 院 部: 計(jì)算機(jī)與信息工程學(xué)
2、院 </p><p> 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 組 別: </p><p> 起止日期: 2012年 5月16日 ~2012
3、年 6 月 24日 </p><p> 指導(dǎo)教師: </p><p><b> 目 錄</b></p><p><b> 1 引言1</b></p><p><b> 2 需求
4、分析1</b></p><p> 2.1 問題描述1</p><p> 2.2 功能需求2</p><p> 2.3 實(shí)現(xiàn)要點(diǎn)2</p><p> 2.4 實(shí)現(xiàn)環(huán)境2</p><p><b> 3 概要設(shè)計(jì)2</b></p><p> 3
5、.1 抽象數(shù)據(jù)類型圖的定義2</p><p><b> 3.2 主程序3</b></p><p><b> 4 詳細(xì)設(shè)計(jì)3</b></p><p> 4.1 數(shù)學(xué)模型3</p><p> 4.2 核心代碼3</p><p> 4.2.1定位函數(shù)模塊3&l
6、t;/p><p> 4.2.2構(gòu)造無向網(wǎng)G的鄰接矩陣函數(shù)模塊4</p><p> 4.2.3鄰接矩陣輸出模塊5</p><p> 4.2.4 最短路徑和求最大利潤模塊5</p><p> 4.2.5主函數(shù)模塊7</p><p> 5 調(diào)試與操作說明:8</p><p> 5.1
7、 調(diào)試界面8</p><p> 5.2 使用說明9</p><p> 6 程序設(shè)計(jì)總結(jié)與體會9</p><p><b> 7 致謝11</b></p><p><b> 8 參考文獻(xiàn)12</b></p><p><b> 9 附錄13</
8、b></p><p><b> 1 引言</b></p><p> “數(shù)據(jù)結(jié)構(gòu)”是計(jì)算機(jī)程序設(shè)計(jì)的重要理論技術(shù)基礎(chǔ),它不僅是計(jì)算機(jī)學(xué)科的核心課程,而且已成為其他理工科的專業(yè)選修課。</p><p> 圖的有關(guān)知識在很多領(lǐng)域有著廣泛的應(yīng)用,在很多情況下是要在尋找兩個頂點(diǎn)之間的最短路徑,本課程設(shè)計(jì)是商品銷售問題,求從滁州銷售商品到各個城
9、市的最大利潤。</p><p><b> 2 需求分析</b></p><p><b> 2.1問題描述</b></p><p> 現(xiàn)有一批商品,需要從滁州市銷售到另一城市中。圖1給出了滁州市到其余8個城市的距離以及該商品在這8個城市中的銷售價格。圖2給出了這8個城市之間的距離。假設(shè)該商品在滁州市的價格為2元/千克,
10、運(yùn)送1噸商品所需運(yùn)費(fèi)為每公里0.5元,現(xiàn)有10噸商品,編程實(shí)現(xiàn)求從滁州市銷售到各個城市所能獲得的最大利潤。</p><p> 表2-1 滁州到各個城市之間的距離及商品在各個城市之間的售價</p><p> 表1-2 各個城市之間的距離</p><p><b> 設(shè)計(jì)要求:</b></p><p> ?。?)將該圖存
11、儲為鄰接矩陣或鄰接表的形式。</p><p> ?。?)若這批商品要從滁州市賣往其余各市,需給出選擇走那條路線,并求出所能獲得的最大利潤。</p><p><b> 2.2 功能需求</b></p><p><b> 要求完成以下功能:</b></p><p> ?、?以無向網(wǎng)鄰接矩陣形式輸出表
12、格1和表格2中兩城市間的路徑長度。</p><p> ?、?輸出從滁州到各城市最短路徑上經(jīng)過的城市及最短路徑長度和商品賣到的最大利潤。</p><p><b> 2.3 實(shí)現(xiàn)要點(diǎn)</b></p><p> ?、?輸入城市數(shù),道路數(shù)和兩城市之間道路長度。</p><p> ?、?兩城市之間的距離以鄰接矩陣形式存儲。<
13、;/p><p><b> 2.4 實(shí)現(xiàn)環(huán)境</b></p><p><b> 編成語言:C語言;</b></p><p> 開發(fā)環(huán)境:Window XP ,VC++ 6.0;</p><p><b> 3 概要設(shè)計(jì)</b></p><p> 3.1
14、抽象數(shù)據(jù)類型圖的定義</p><p> ADT Graph{</p><p> 數(shù)據(jù)對象V:V是具有相同特性數(shù)據(jù)元素的集合,稱為頂點(diǎn)集。</p><p><b> 數(shù)據(jù)關(guān)系R:</b></p><p><b> R={VR}</b></p><p> VR={(v,
15、w)| v , w∈V, (v , w)表示v和w之間存在路徑}</p><p><b> 基本操作P:</b></p><p> CreatGraph(&G, V, VR)</p><p> 初始條件: V是圖的頂點(diǎn)集,VR是圖中邊的集合。</p><p> 操作結(jié)果: 按定義(V, VR) 構(gòu)造圖G。
16、</p><p> LocateVex(G, u) </p><p> 初始條件: 圖G存在,u和G中頂點(diǎn)具有相同特征。</p><p> 操作結(jié)果: 若G中存在頂點(diǎn)u,則返回該頂點(diǎn)在圖中“位置” ;否則返回</p><p><b> 其它信息。</b></p><p> GetVex
17、(G, v) </p><p> 初始條件: 圖G存在,v是G中某個頂點(diǎn)。</p><p> 操作結(jié)果: 返回v的信息。</p><p> InsertVex(&G, v) </p><p> 初始條件: 圖G存在,v和G中頂點(diǎn)具有相同特征。</p><p> 操作結(jié)果: 在圖G中增添新頂點(diǎn)v。<
18、;/p><p> InsertArc(&G, v, w) </p><p> 初始條件: 圖G存在,v和w是G中兩個頂點(diǎn)。</p><p> 操作結(jié)果: 在G中增添弧<v,w>,若G是無向的,則還增添對稱弧<w,v>。</p><p> DeleteArc(&G, v, w)</p>
19、<p> 初始條件: 圖G存在,v和w是G中兩個頂點(diǎn)。</p><p> 操作結(jié)果: 在G中刪除弧<v,w>,若G是無向的,則還刪除對稱弧<w,v>。</p><p> } ADT Graph</p><p><b> 3.2 主程序</b></p><p> void mai
20、n( )</p><p><b> {</b></p><p> // 輸出圖的鄰接矩陣;</p><p> // 輸入起始點(diǎn)v0;</p><p> // 輸出從滁州到各城市最短路徑上經(jīng)過的城市及最短路徑長度和商品賣到的最大利潤;</p><p><b> }</b&g
21、t;</p><p><b> 4 詳細(xì)設(shè)計(jì)</b></p><p><b> 4.1 數(shù)學(xué)模型</b></p><p> 目標(biāo)城市的銷售單價價格減去商品在滁州的價格乘以商品總量再減去運(yùn)費(fèi),即為滁州到各個城市的所獲的最大利潤。數(shù)學(xué)公式為最大利潤S =(a[v-1]-2)*pow(10,4)-d*0.5*10,a[v-
22、1]為物品在要到達(dá)的城市的單價,d為最短路徑長度;</p><p><b> 4.2 核心代碼</b></p><p> 4.2.1定位函數(shù)模塊</p><p> // 功能:查找頂點(diǎn)在圖中的位置。</p><p> // 輸入:G代表建立的那個無向圖,vert代表在圖中的某個頂點(diǎn)。</p><
23、;p> // 輸出:找到了就輸出該頂點(diǎn)的位置,否則出-1。</p><p> int LocateVex(MGraph G,char *vert)</p><p><b> { </b></p><p><b> int i;</b></p><p> for(i=0; i<
24、;G.vexnum; i++)</p><p> if(strcmp(G.vexs[i],vert)==0)//strcmp 比較兩個字符的大小</p><p><b> return i;</b></p><p> return -1;</p><p><b> }</b></p&
25、gt;<p> 4.2.2構(gòu)造無向網(wǎng)G的鄰接矩陣函數(shù)模塊</p><p> // 功能:構(gòu)造無向網(wǎng)鄰接矩陣。</p><p> // 輸入:G代表所要建立的那個圖的參數(shù)。</p><p> // 輸出:建立出這個無向網(wǎng)鄰接矩陣,保存在arcs這個數(shù)組中。</p><p> MGraph CreateGraph_DN(
26、 MGraph G )</p><p> {//建立無向網(wǎng)G的鄰接矩陣</p><p> int i, j, k;</p><p><b> float w;</b></p><p> VexType v1[100], v2[100];</p><p> printf("
27、輸入城市數(shù), 城市之間的道路數(shù):");</p><p> scanf("%d %d", &G.vexnum, &G.arcnum);</p><p> for(i=0; i<G.vexnum; i++) // 讀入所有的頂點(diǎn) </p><p> { printf("輸入第%d個城市的信息:&
28、quot;,i+1);</p><p> scanf("%s", &G.vexs[i]);</p><p><b> }</b></p><p> for(i=0; i <G.vexnum; i++) //初始化鄰接矩陣 </p><p> for(j=0; j<G.
29、vexnum; j++) </p><p> G.arcs[i][j].adj=INFINITY;</p><p> for(k=0; k<G.arcnum; k++) { // 輸入所有的邊 </p><p> printf("輸入第%d條道路依附的兩個城市和該道路上的權(quán)值:", k+1);</p><p
30、> scanf("%s %s %f", &v1, &v2, &w);</p><p> // 查詢兩個頂點(diǎn)在圖中存儲的位置 ,然后對其進(jìn)行相關(guān)賦值</p><p> i = LocateVex(G, v1);</p><p> j = LocateVex(G, v2);</p><p&
31、gt; if (i==-1 || j==-1)</p><p> {printf("輸入的道路不正確\n"); }</p><p> G.arcs[i][j].adj = w;//給相關(guān)兩個頂點(diǎn)邊賦相應(yīng)權(quán)值。</p><p> G.arcs[j][i].adj = w;//因?yàn)檫@是無向圖,所以只要交換里面的頂點(diǎn)位置即可。</p&
32、gt;<p><b> }</b></p><p><b> return G;</b></p><p><b> }</b></p><p> 4.2.3鄰接矩陣輸出模塊</p><p> // 功能:輸出我們上面那個函數(shù)建立的鄰接矩陣。</p&
33、gt;<p> // 輸入:上面建立的那個無向網(wǎng)鄰接矩陣的參數(shù)。</p><p> // 輸出:輸出上面建立的無向網(wǎng)鄰接矩陣,通過界面顯示出來。</p><p> Void print_MGraph(MGraph G)//輸出圖的鄰接矩陣表示</p><p><b> {</b></p><p>&
34、lt;b> int i,j;</b></p><p> /* 鄰接矩陣存儲時用的是一個二維數(shù)組,之前在構(gòu)造鄰接矩陣時,已經(jīng)將相關(guān)邊上的權(quán)值 </p><p> 已經(jīng)賦了值. 現(xiàn)在通過兩個for循環(huán),將這個二維數(shù)組輸出*/</p><p> for(i=0;i<G.vexnum;i++)</p><p> {
35、 for(j=0;j<G.vexnum;j++)</p><p> printf("%f ",G.arcs[i][j].adj ); </p><p> printf("\n");</p><p><b> } </b></p><p><b>
36、}</b></p><p> 4.2.4最短路徑和求最大利潤模塊</p><p> // 功能:求最短路徑和最大利潤。</p><p> // 輸入:剛剛建立的這個圖,單源點(diǎn)v0,存儲最短路徑的數(shù)組p,以及存儲最短路徑的權(quán)值大小。</p><p> // 輸出:滁州到各城市的最短路徑距離,最短路徑,滁州到各個城市所能獲得的
37、最大利潤。</p><p> void ShortestPath_DIJ(MGraph G, int v0, int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM], float D[MAX_VERTEX_NUM]){</p><p> float a[]={3.7f,4.0f,3.9f,2.9f,3.3f,3.8f,3.6f,3.6f};//各個城市商品單價存在一
38、個一維數(shù)組中,便于后面調(diào)用,在每個數(shù)字后面加f,是解決當(dāng)時編寫代碼時出現(xiàn)的警告問題,就是為了解決精度問題</p><p> int v, w, i, j, min;</p><p> float S,d;</p><p> int final[MAX_VERTEX_NUM];//標(biāo)志數(shù)組。當(dāng)final[v]為真當(dāng)且僅當(dāng)v屬于S ,即已經(jīng)求的從v0到v的最短路徑
39、</p><p> for(v=0; v<G.vexnum; ++v){</p><p> final[v]=FALSE;//說明還木有從v0到v的最短路徑。</p><p> D[v]=G.arcs[v0][v].adj;//把從v0到v之間邊上的權(quán)值復(fù)制到前面那個數(shù)組</p><p> for(w=0; w<G.vex
40、num; ++w) P[v][w]=FALSE; // 設(shè)空路徑,前面那句話說明w不是v0到v當(dāng)前求得最短路徑上的頂點(diǎn)</p><p> if(D[v]<INFINITY ){</p><p> P[v][v0]=TRUE;</p><p> P[v][v]=TRUE;//說明v0到v之間有權(quán)值,即有路徑。</p><p>&l
41、t;b> }</b></p><p><b> }</b></p><p> D[v0] = 0;</p><p> final[v0] = TRUE; // 初始化,將v0頂點(diǎn)加入S集</p><p> for( i=1; i<G.vexnum; ++i ) {</p>
42、;<p> min = INFINITY; // 當(dāng)前所知離v0頂點(diǎn)的最近距離</p><p> for( w=0; w<G.vexnum; ++w )</p><p> if( !final[w] ) // w頂點(diǎn)在V-S中</p><p> if( D[w]<min){</p><p&
43、gt;<b> v = w;</b></p><p><b> min=D[w];</b></p><p> } // w頂點(diǎn)離v0頂點(diǎn)更近</p><p> final[v] = TRUE; // 離v0頂點(diǎn)最近的v加入S集</p><p> for(w
44、=0;w<G.vexnum;++w) { // 更新當(dāng)前最短路徑及距離</p><p> if( !final[w] && (min+G.arcs[v][w].adj<D[w]) ){</p><p> D[w ]= min+G.arcs[v][w].adj;//更新最短路徑上的權(quán)值。</p><p> for( j=0; j&l
45、t;G.vexnum; ++j){</p><p> P[w][j] = P[v][j];</p><p> P[w][w]=TRUE;}//說明j是當(dāng)前v到我這個最短路徑上的頂點(diǎn)</p><p><b> }</b></p><p><b> }</b></p><p&
46、gt;<b> }</b></p><p> for( v=1; v<G.vexnum; ++v ){</p><p> if(v!=v0 && D[v]==INFINITY) </p><p> printf("從城市%s到城市%s無最短路徑\n",G.vexs[v0],G.vexs[v]);
47、</p><p> else if(v!=v0)</p><p><b> {</b></p><p> printf("從城市%s到城市%s的最短路徑上經(jīng)過的頂點(diǎn)有",G.vexs[v0],G.vexs[v]);</p><p> printf("(%s",G.vexs[
48、v0]);//在本題中即指滁州,即圖中的單源點(diǎn)</p><p> for( w=1; w<G.vexnum; ++w )</p><p><b> {</b></p><p> if(P[v][w]==TRUE && w!=v0 && w!=v) printf(",%s",G.ve
49、xs[w]);//這段代碼就是就是要通過P[][]這個數(shù)組,將v0到v之間的頂點(diǎn)輸出,在本題中就是要輸出從滁州到各個城市之間最短路徑上的城市。</p><p><b> }</b></p><p> printf(",%s)",G.vexs[v]);//目的地城市</p><p> d=D[v];//從滁州到各個城市最
50、短路徑上的權(quán)值之和。</p><p> S=(a[v-1]-2)*pow(10,4)-d*0.5*10;//通過這個數(shù)學(xué)函數(shù)求得從滁州到各個城市之間的最大利潤.這里用到之前那個存商品售價的一維數(shù)組。</p><p> printf("最短路徑長度為:%f ",d);</p><p> printf ("從城市%s到城市%s的最大
51、利潤:%f\n",G.vexs[v0],G.vexs[v],S);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 4.2.5主函數(shù)模塊</p><p>
52、; // 功能:調(diào)用相應(yīng)子函數(shù)的功能,實(shí)現(xiàn)相應(yīng)功能。</p><p> void main()</p><p><b> {</b></p><p> MGraph G1;</p><p><b> int v0;</b></p><p> int P[MAX_V
53、ERTEX_NUM][MAX_VERTEX_NUM];//存儲最短路徑的數(shù)組</p><p> float D[MAX_VERTEX_NUM];//存儲最小權(quán)值的數(shù)組,本題中就是存儲滁州到各個城市最短距離的值。</p><p> G1=CreateGraph_DN( G1 );//調(diào)用構(gòu)造函數(shù),構(gòu)造一個鄰接矩陣存儲這個實(shí)際問題的數(shù)據(jù)!</p><p> Pri
54、nt_MGraph(G1);//調(diào)用打印函數(shù),打印出這個鄰接矩陣</p><p> printf("輸入源點(diǎn)v0:");//本題中即指輸入滁州這個城市</p><p> scanf("%d",&v0);</p><p> ShortestPath_DIJ(G1,v0,P,D);//調(diào)用最短路徑函數(shù)求出最短路徑和滁
55、州到各個城市之間所能獲得的最大利潤。</p><p><b> }</b></p><p> 5 調(diào)試與操作說明:</p><p><b> 5.1 調(diào)試界面</b></p><p> 內(nèi)容如下:⑴.將這個問題抽象化成一個圖的模型,然后構(gòu)造一個無向圖。</p><p>
56、; ?、?求滁州到各個城市的最短路徑。</p><p> ⑶.根據(jù)最短路徑求滁州到各個城市的最大利潤。</p><p> 圖5-1 運(yùn)行界面1</p><p> 圖5-2 運(yùn)行界面2</p><p><b> 5.2使用說明</b></p><p> 本程序在求最短路徑的問題上采用迪
57、杰斯特拉算法解決,先求出滁州到各個城市之間的最短路徑,再利用數(shù)學(xué)模型解決最大利潤問題。調(diào)試時根據(jù)提示先輸入城市數(shù)和道路數(shù),再輸入城市信息及城市之間的路徑長度。按Enter鍵,上述信息將以無向網(wǎng)鄰接矩陣形式輸入。再輸入起始點(diǎn)v0(滁州),即可輸出滁州到各個城市最短路徑上經(jīng)過的城市及路徑長度和最大利潤。</p><p> 6 程序設(shè)計(jì)總結(jié)與體會</p><p> 課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用
58、所學(xué)知識發(fā)現(xiàn)、提出、分析和解決實(shí)際問題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過程。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,將結(jié)論用于實(shí)踐,從而提高自己的實(shí)際動手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中當(dāng)然遇到了問題,當(dāng)初寫最短路徑的函數(shù)時,改寫書上的算法時,出現(xiàn)了許多問題,還有當(dāng)初我準(zhǔn)備再寫一個子函數(shù)算出到每個城市的最大利
59、潤,但是后來我把各個城市的產(chǎn)品單價通過一個一維數(shù)組存起來,然后通過一個循環(huán)調(diào)用進(jìn)去,很好的解決了這個問題,但是在寫這個數(shù)組時,出現(xiàn)了很多警告,后來在數(shù)組里的各個數(shù)據(jù)里加了f,如后面float a[]={3.7f,4.0f,3.9f,2.9f,3.3f,3.8f,3.6f,3.6f};問題得到解決。還有在輸入時時也遇到了一些問題,就是輸入第幾個城市時,我當(dāng)時想選第一個城市,可是后面的輸出,總是往后面退了一個,這時它會輸出第二個城市到各個城
60、市的最短距離,后來我發(fā)現(xiàn)是我自己理解錯了,代碼沒問題,一維數(shù)組的下標(biāo)從0開始。由于本程序要輸入</p><p><b> 7 致謝 </b></p><p> 在寫本程序時,調(diào)試出現(xiàn)警告,在網(wǎng)上發(fā)帖(csdn論壇),后解決,感謝網(wǎng)友的幫助。</p><p> 同時在撰寫課程設(shè)計(jì)報(bào)告時,感謝趙瑞斌老師和楊傳建老師的幫助,幫助我們改寫文檔格式
61、,簡化內(nèi)容,排版,幫助我們調(diào)試代碼。</p><p><b> 8 參考文獻(xiàn)</b></p><p> [1] 嚴(yán)蔚敏,吳偉民編著.數(shù)據(jù)結(jié)構(gòu)(c語言版)[M].北京:清華大學(xué)出版社,2011.</p><p> [2] 趙波主編.數(shù)據(jù)結(jié)構(gòu)實(shí)用教程(c語言版)[M]. 清華大學(xué)出版社,2010.</p><p>&l
62、t;b> 9 附錄</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <math.h></p><p> #include "malloc.h"<
63、/p><p> #include "string.h"</p><p> #define INFINITY 10000// 用整型最大值代替∞</p><p> #define MAX_VERTEX_NUM 20 // 最大頂點(diǎn)個數(shù)</p><p> #define OK 1</p><p>
64、 #define ERROR 0</p><p> #define FALSE 0</p><p> #define TRUE 1</p><p> #define MAXQSIZE100 </p><p> typedef int QElemType;</p><p> typedef float VRT
65、ype;</p><p> typedef float InfoType;</p><p> typedef char VertexType;</p><p> typedef char VexType;</p><p> //============鄰接矩陣的定義============ </p><p>
66、 typedef struct {</p><p> VRType adj; </p><p> InfoType info; // 該弧相關(guān)信息的指針(可無) </p><p> }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];</p><p> typedef str
67、uct {</p><p> VertexType vexs[MAX_VERTEX_NUM][100]; // 頂點(diǎn)向量</p><p> AdjMatrix arcs; // 鄰接矩陣</p><p> int vexnum,arcnum; // 圖的當(dāng)前頂點(diǎn)數(shù)和弧數(shù)</p><p> } MGraph ;</p>&
68、lt;p> //=======================鄰接矩陣的定義========</p><p> int LocateVex(MGraph G,char *vert)</p><p> { int i;</p><p> for(i=0; i<G.vexnum; i++)</p><p> if(str
69、cmp(G.vexs[i],vert)==0)</p><p><b> return i;</b></p><p> return -1;</p><p><b> }</b></p><p> MGraph CreateGraph_DN( MGraph G ){//建立無向網(wǎng)G的鄰接矩
70、陣</p><p> int i, j,k;</p><p><b> float w;</b></p><p> VexType v1[100], v2[100];</p><p> printf("輸入城市數(shù),城市之間的道路數(shù):");</p><p> sca
71、nf("%d %d", &G.vexnum, &G.arcnum);</p><p> for(i=0; i<G.vexnum; i++) // 讀入所有的頂點(diǎn) </p><p> { printf("輸入第%d個城市的信息:",i+1);</p><p> scanf("%s&q
72、uot;, &G.vexs[i]);</p><p><b> }</b></p><p> for(i=0; i <G.vexnum; i++) //初始化鄰接矩陣 </p><p> for(j=0; j<G.vexnum; j++) </p><p> G.arcs[i][j].
73、adj=INFINITY;</p><p> for(k=0; k<G.arcnum; k++) { // 輸入所有的邊 </p><p> printf("輸入第%d條道路依附的兩個城市和該道路上的權(quán)值:",k+1);</p><p> scanf("%s %s %f", &v1, &v2,
74、 &w);</p><p> // 查詢兩個頂點(diǎn)在圖中存儲的位置 </p><p> i = LocateVex(G, v1);</p><p> j = LocateVex(G, v2);</p><p> if (i==-1 || j==-1)</p><p> {printf("輸
75、入的道路不正確\n"); }</p><p> G.arcs[i][j].adj = w;</p><p> G.arcs[j][i].adj = w;</p><p><b> }</b></p><p><b> return G;</b></p><p&g
76、t;<b> }</b></p><p> void Print_MGraph(MGraph G)//輸出圖的鄰接矩陣表示</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=0;i<G.vex
77、num;i++)</p><p> { for(j=0;j<G.vexnum;j++)</p><p> printf("%f ",G.arcs[i][j].adj ); /*鄰接矩陣*/</p><p> printf("\n");</p><p><b> } &l
78、t;/b></p><p><b> }</b></p><p> void ShortestPath_DIJ(MGraph G, int v0, int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM], float D[MAX_VERTEX_NUM]){</p><p> float a[]={3.7f,4.0
79、f,3.9f,2.9f,3.3f,3.8f,3.6f,3.6f};</p><p> int v, w, i, j, min;</p><p> float S,d;</p><p> int final[MAX_VERTEX_NUM];</p><p> for(v=0; v<G.vexnum; ++v){</p>
80、<p> final[v]=FALSE;</p><p> D[v]=G.arcs[v0][v].adj;</p><p> for(w=0; w<G.vexnum; ++w) P[v][w]=FALSE; // 設(shè)空路徑</p><p> if(D[v]<INFINITY ){</p><p> P[v
81、][v0]=TRUE;</p><p> P[v][v]=TRUE;</p><p><b> }</b></p><p><b> }</b></p><p> D[v0] = 0;</p><p> final[v0] = TRUE; // 將v0頂點(diǎn)加入
82、S集</p><p> for( i=1; i<G.vexnum; ++i ) {</p><p> min = INFINITY; // 當(dāng)前所知離v0頂點(diǎn)的最近距離</p><p> for( w=0; w<G.vexnum; ++w )</p><p> if( !final[w] ) //
83、w頂點(diǎn)在V-S中</p><p> if( D[w]<min){</p><p><b> v = w;</b></p><p><b> min=D[w];</b></p><p> } // w頂點(diǎn)離v0頂點(diǎn)更近</p><p> fi
84、nal[v] = TRUE; // 離v0頂點(diǎn)最近的v加入S集</p><p> for(w=0;w<G.vexnum;++w) { // 更新當(dāng)前最短路徑及距離</p><p> if( !final[w] && (min+G.arcs[v][w].adj<D[w]) ){</p><p> D[w ]= min+
85、G.arcs[v][w].adj;</p><p> for( j=0; j<G.vexnum; ++j){</p><p> P[w][j] = P[v][j];</p><p> P[w][w]=TRUE;}</p><p><b> }</b></p><p><b>
86、; }</b></p><p><b> }</b></p><p> for( v=1; v<G.vexnum; ++v ){</p><p> if(v!=v0 && D[v]==INFINITY) </p><p> printf("從城市%s到城市%s無最短路
87、徑\n",G.vexs[v0],G.vexs[v]);</p><p> else if(v!=v0)</p><p><b> {</b></p><p> printf("從城市%s到城市%s的最短路徑上經(jīng)過的頂點(diǎn)有",G.vexs[v0],G.vexs[v]);</p><p>
88、 printf("(%s",G.vexs[v0]);</p><p> for( w=1; w<G.vexnum; ++w )</p><p><b> {</b></p><p> if(P[v][w]==TRUE && w!=v0 && w!=v) printf("
89、,%s",G.vexs[w]);</p><p><b> }</b></p><p> printf(",%s)",G.vexs[v]);</p><p><b> d=D[v];</b></p><p> S=(a[v-1]-2)*pow(10,4)-d*0
90、.5*10;</p><p> printf("最短路徑長度為:%f ",d);</p><p> printf ("從城市%s到城市%s的最大利潤:%f\n",G.vexs[v0],G.vexs[v],S);</p><p><b> }</b></p><p><
91、b> }</b></p><p><b> }</b></p><p> //===========================最短路徑===================</p><p> void main()</p><p><b> {</b></p&
92、gt;<p> MGraph G1;</p><p><b> int v0;</b></p><p> int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM];</p><p> float D[MAX_VERTEX_NUM];</p><p> G1=CreateGraph
93、_DN( G1 );</p><p> Print_MGraph(G1);</p><p> printf("輸入源點(diǎn)v0:");</p><p> scanf("%d",&v0);</p><p> ShortestPath_DIJ(G1,v0,P,D);</p>&l
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--dijkstra算法求最短路徑
- 課程設(shè)計(jì)--最短路徑拯救007
- 課程設(shè)計(jì)-故宮導(dǎo)游咨詢設(shè)計(jì)(最短路徑)
- 最短路徑--拯救007課程設(shè)計(jì)
- 單元點(diǎn)最短路徑算法的實(shí)現(xiàn)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu),課程設(shè)計(jì),校園最短路徑問題
- 通信網(wǎng)最短路徑課程設(shè)計(jì)--基于c語言對d算法最短路徑的求解
- 專題復(fù)習(xí)六求最短路徑問題
- a算法的改進(jìn)課程設(shè)計(jì)--a最短路徑算法的改進(jìn)
- 最短路徑問題―――螞蟻爬行的最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖頂點(diǎn)間最短路徑算法
- 最短路徑問題--教學(xué)設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---交通旅游圖的最短路徑問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--弗洛伊德算法與最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--可視化弗洛伊德最短路徑
- 最短路徑學(xué)年論文
- 最短路徑問題(經(jīng)典)
- 最短路徑規(guī)劃研究
- 最短路徑問題(經(jīng)典)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--用c#語言解決最短路徑的問題
評論
0/150
提交評論