




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編號(hào): 江西理工大學(xué) 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 班 級(jí): 學(xué) 號(hào): 姓 名: 時(shí) 間: 2015年6月22日2015年7月3日 指導(dǎo)教師: 2015年06月目 錄一、 摘要 .3二、 引言.3三、 需求分析.3四、 概要設(shè)計(jì).41. 普利姆算法分析.62. 模塊分析.63. 抽象數(shù)據(jù)類型分析.64. 全部流程.6五、 詳細(xì)設(shè)計(jì).71. 算法分析.7(一) 信息輸入模塊.7(二) 建立最小生成樹并輸出結(jié)果.82. 源程序代碼.9六、 測(cè)試結(jié)果.14程序開始.14信息輸入.14輸出結(jié)果.14七、 設(shè)計(jì)體會(huì).15八、 結(jié)束語.16參考文獻(xiàn).16 一、 摘要 N(N>10)個(gè)居民區(qū)之間需要鋪設(shè)煤氣管
2、道。假設(shè)任意兩個(gè)居民區(qū)之間都可以鋪設(shè)煤氣管道,但代價(jià)不同。問題的實(shí)質(zhì)就是編寫相應(yīng)程序求解最小生成樹問題。程序要求:事先任意兩個(gè)居民區(qū)之間鋪設(shè)煤氣管道的代價(jià)存入磁盤文件中。設(shè)計(jì)一個(gè)最佳方案使得這N個(gè)居民區(qū)之間鋪設(shè)煤氣管道所需代價(jià)最小,并將結(jié)果以圖形方式在屏幕上輸出。二、 引言C語言作為一門最通用的語言,從語言產(chǎn)生到現(xiàn)在,它已經(jīng)成為最重要和最流行的編程語言之一。在各種流行編程語言中,都能看到C語言的影子。學(xué)習(xí)掌握C語言是每一個(gè)計(jì)算機(jī)技術(shù)人員的基本功之一。實(shí)際生活中最小生成樹的問題具有很大的意義。例如,本文所討論的構(gòu)架居民區(qū)之間鋪設(shè)煤氣管道代價(jià)最小,還有在若干地區(qū)鋪設(shè)光纜等等。最小生成樹讓許多諸如求
3、造價(jià)最小、最短路徑等最優(yōu)化的現(xiàn)實(shí)問題找到了理論依據(jù),并提供了有效的解決方法。三 需求分析 在N(N>10)個(gè)居民區(qū)之間鋪設(shè)煤氣管道所需代價(jià)最小,即求最小生成樹問題。在我們的課本中介紹了兩種求解方法:普利姆算法和克魯斯卡爾算法。普利姆算法與網(wǎng)的變數(shù)無關(guān), 適宜求解邊稠密的網(wǎng)的最小生成樹。而克魯斯卡爾算法正好相反, 適宜求解邊稀疏的最小生成樹。 由于在實(shí)際問題中,居民數(shù)量一般很有限,而任何兩個(gè)居民區(qū)都可能有連線,即這樣的圖應(yīng)該是邊較為稠密的。因此,我們選擇了普利姆算法對(duì)問題進(jìn)行求解。四 概要設(shè)計(jì)1. 普利姆算法分析1普利姆算法思想 普利姆算法的思想是:在圖中人去一個(gè)定點(diǎn)k0作為開始點(diǎn),令U=
4、k0,W=V-U,其中V為圖中所有頂點(diǎn)集,然后找一個(gè)頂點(diǎn)在U中,另一個(gè)頂點(diǎn)在w中的邊中最短的一條,找到后,將該邊作為最小生成樹的樹邊保存起來,并將該邊頂點(diǎn)全部加入U(xiǎn)集合中,并從W中刪除這些頂點(diǎn),然后重新調(diào)整U中頂點(diǎn)到W中頂點(diǎn)的距離,使之保持最小,再重復(fù)此過程,直到W為空集。2 算法過程描述1) 在圖G=(V,E)(V是頂點(diǎn),E是邊)中,從集合V中任取一個(gè)頂點(diǎn),如k0放入集合U中,這時(shí),U=k0,集合T(E)為空。2) 從k0出發(fā)尋找與U中頂點(diǎn)相鄰權(quán)值最小的邊的另一頂點(diǎn)k1 ,并使k1加入U(xiǎn)。即U=k0,k1,同時(shí)將該邊加入集合T(E)中。3) 重復(fù)(2),直到U=V為止。4) 這時(shí)T(E)中有
5、n-1條邊,T=(U,T(E)就是一一顆最小生成樹。 2、模塊分析 根據(jù)對(duì)模型的功能分析,該管道鋪設(shè)設(shè)計(jì)可以具有以下功能: 1管道鋪設(shè)信息的輸入; 2最小生成樹信息的輸出; 功能模塊圖: 3.抽象數(shù)據(jù)類型分析areanum 居民區(qū)總數(shù)(頂點(diǎn)總數(shù));edgenum 邊的總數(shù);date 20 鄰接矩陣存儲(chǔ)圖結(jié)構(gòu);s 邊的權(quán)值;short-wayi 居民區(qū)i到目前生成樹中所有點(diǎn)集U中某個(gè)居民區(qū)的路程最小值near-areai U中能使其最小的居民區(qū)5. 全部流程 五、詳細(xì)設(shè)計(jì)1.算法分析1信息輸入模塊/讀入圖的信息,并將鄰接矩陣輸出Void read()/輸入頂點(diǎn)個(gè)數(shù)和邊的條數(shù)Printf(“請(qǐng)輸入
6、:定點(diǎn)數(shù),變數(shù):n”);Scanf(“%d,%d”,&areanum,&dedgenm);/初始化鄰接矩陣各元素值Int i, j,k;for(i=0;i<areanum;i+)for(j=0;j<areanum;j+)date i j=INFINITY;/讀入邊Int from,to ,s;Printf(“輸入邊,格式為i,j,k,表示i到j(luò)的權(quán)值是k:n”);For(i=0;i<degenum;i+)Scanf(“%d,%d,%d”,&from,&to,&s);date fromto=s;date tofromst;/輸出鄰接矩陣f
7、or(i=0;i<areanum;i+)for(j=0;j<areanum;j+)Printf(“%dt”,datei j);Printf(“n”); 2建立最小生成樹并輸出結(jié)果 / 用普里姆算法從第u個(gè)頂點(diǎn)出發(fā)構(gòu)造網(wǎng)G的最小生成樹T,輸出T的各條邊void MiniSpanTree_PRIM(MGraph G,VertexType u) /system("cls");int i,j,k;minside closedge;k=LocateVex(G,u);for(j=0;j<G.vexnum;+j) / 輔助數(shù)組初始化 if(j!=k)strcpy(clo
8、sedgej.adjvex,u);closedgej.lowcost=G.arcskj.adj;closedgek.lowcost=0; / 初始,U=u printf("最小代價(jià)生成樹的各條邊為:n");for(i=1;i<G.vexnum;+i) / 選擇其余G.vexnum-1個(gè)頂點(diǎn) k=minimum(closedge,G); / 求出T的下一個(gè)結(jié)點(diǎn):第K頂點(diǎn) printf("(%s-%s)n",closedgek.adjvex,G.vexsk); / 輸出生成樹的邊 closedgek.lowcost=0; / 第K頂點(diǎn)并入U(xiǎn)集 for(
9、j=0;j<G.vexnum;+j)if(G.arcskj.adj<closedgej.lowcost)/ 新頂點(diǎn)并入U(xiǎn)集后重新選擇最小邊 strcpy(closedgej.adjvex,G.vexsk);closedgej.lowcost=G.arcskj.adj;system("pause");2. 源程序代碼#include <stdio.h>#include <limits.h>#include<string.h>#include <malloc.h>#include<stdlib.h>#def
10、ine MAX_VERTEX_NUM 20/ 最大頂點(diǎn)個(gè)數(shù)#define MAX_NAME 3 / 頂點(diǎn)字符串的最大長(zhǎng)度+1 /#define MAX_INFO 20 / 相關(guān)信息字符串的最大長(zhǎng)度+1 #define INFINITY INT_MAX/ 用整型最大值代替typedef int VRType;typedef char InfoType;typedef char VertexTypeMAX_NAME;/ 鄰接矩陣的數(shù)據(jù)結(jié)構(gòu)typedef structVRType adj; / 頂點(diǎn)關(guān)系類型。對(duì)無權(quán)圖,用1(是)或0(否)表示相鄰否; / 對(duì)帶權(quán)圖,則為權(quán)值類型 InfoType *
11、info; / 該弧相關(guān)信息的指針(可無) ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM; / 圖的數(shù)據(jù)結(jié)構(gòu)typedef structVertexType vexsMAX_VERTEX_NUM;/ 頂點(diǎn)向量AdjMatrix arcs;/ 鄰接矩陣int vexnum,/ 圖的當(dāng)前頂點(diǎn)數(shù)arcnum;/ 圖的當(dāng)前弧數(shù) MGraph; / 記錄從頂點(diǎn)集U到V-U的代價(jià)最小的邊的輔助數(shù)組定義typedef structVertexType adjvex;VRType lowcost;minsideMAX_VERTEX_NUM; / 若G中存在頂點(diǎn)u
12、,則返回該頂點(diǎn)在圖中位置;否則返回-1。int LocateVex(MGraph G,VertexType u)int i;for(i = 0; i < G.vexnum; +i)if( strcmp(u, G.vexsi) = 0)return i;return -1;/代價(jià)保存為文件/代價(jià)存入文件void wenjian()/system("cls");FILE *fp;char s50,ch;strcpy(s,"D:record.txt");if(fp=fopen(s,"ab+")=NULL) printf("無
13、法打開此文件n");exit(0);else/printf("請(qǐng)向磁盤中輸入原點(diǎn)總數(shù)和邊的總數(shù):n"); /printf("請(qǐng)輸入頂點(diǎn)數(shù)邊數(shù)n");/scanf("%d %d",&G.vexnum,&G.arcnum);/printf("請(qǐng)輸入各居民點(diǎn):");/for(int i=1;i<=N;i+)/scanf("%c",&G.vexsi);/in/fput(G.vexsi,fp);/ /printf("請(qǐng)向磁盤中輸入各原點(diǎn)和邊的總數(shù)同時(shí)記錄原
14、點(diǎn),目的點(diǎn),及相應(yīng)的權(quán)值:(輸入#鍵表示結(jié)束)n");printf("請(qǐng)向磁盤中輸入各原點(diǎn)和邊的總數(shù):(輸入$鍵表示結(jié)束)n"); ch=getchar();while(ch!='$')fputc(ch,fp);ch=getchar();printf("請(qǐng)向磁盤中輸入原點(diǎn),目的點(diǎn),及相應(yīng)的權(quán)值:(輸入#鍵表示結(jié)束)n"); ch=getchar();while(ch!='#')fputc(ch,fp);ch=getchar();fclose(fp);system("pause");/從文件中得
15、到信息構(gòu)成圖void xianshi () /system("cls"); FILE *fp;char s50,ch;strcpy(s,"D:record.txt");if(fp=fopen(s,"r")=NULL) printf("無法打開此文件n");exit(0);elsewhile(!feof(fp)ch=fgetc(fp);putchar(ch);putchar(10);fclose(fp);system("pause"); / 算法7.2 P162/ 采用數(shù)組(鄰接矩陣)表示法,構(gòu)造
16、無向網(wǎng)G。int CreateAN(MGraph *G)/system("cls");int i,j,k,w;/char sMAX_INFO,*info;/char *info;VertexType va,vb;printf("請(qǐng)輸入無向網(wǎng)G的頂點(diǎn)數(shù),邊數(shù),(空格區(qū)分) ");scanf("%d%d",&(*G).vexnum,&(*G).arcnum); printf("請(qǐng)輸入%d個(gè)頂點(diǎn)的值:n",(*G).vexnum);for(i=0;i<(*G).vexnum;+i) / 構(gòu)造頂點(diǎn)向量
17、 scanf("%s",(*G).vexsi);for(i=0;i<(*G).vexnum;+i) / 初始化鄰接矩陣 for(j=0;j<(*G).vexnum;+j)(*G).arcsij.adj=INFINITY; / 網(wǎng)初始化為無窮大 /(*G).=NULL;printf("請(qǐng)輸入%d條邊的頂點(diǎn)1 頂點(diǎn)2 權(quán)值(以空格作為間隔): n",(*G).arcnum);for(k=0;k<(*G).arcnum;+k)scanf("%s%s%d%*c",va,vb,&w); / %*c
18、吃掉回車符 i=LocateVex(*G,va);j=LocateVex(*G,vb);(*G).arcsij.adj=(*G).arcsji.adj=w; / 無向 /if(IncInfo)/printf("請(qǐng)輸入該邊的相關(guān)信息(<%d個(gè)字符): ",MAX_INFO);/gets(s);/w=strlen(s);/if(w)/info=(char*)malloc(w+1)*sizeof(char);/strcpy(info,s);/(*G).=(*G).=info; / 無向 /printf("輸出臨接矩陣:n
19、");for(i=0;i<(*G).vexnum;+i)for(j=0;j<(*G).vexnum;+j) if( j%3=0)printf("n");printf("%d ", (*G).arcsij.adj);return 1;system("pause"); / 求closedge.lowcost的最小正值int minimum(minside SZ,MGraph G)int i=0,j,k,min;while(!SZi.lowcost)i+;min=SZi.lowcost; / 第一個(gè)不為0的值 k=i;
20、for(j=i+1;j<G.vexnum;j+)if(SZj.lowcost>0)if(min>SZj.lowcost)min=SZj.lowcost;k=j;return k; / 算法7.9 P175 / 用普里姆算法從第u個(gè)頂點(diǎn)出發(fā)構(gòu)造網(wǎng)G的最小生成樹T,輸出T的各條邊void MiniSpanTree_PRIM(MGraph G,VertexType u) /system("cls");int i,j,k;minside closedge;k=LocateVex(G,u);for(j=0;j<G.vexnum;+j) / 輔助數(shù)組初始化 if
21、(j!=k)strcpy(closedgej.adjvex,u);closedgej.lowcost=G.arcskj.adj;closedgek.lowcost=0; / 初始,U=u printf("最小代價(jià)生成樹的各條邊為:n");for(i=1;i<G.vexnum;+i) / 選擇其余G.vexnum-1個(gè)頂點(diǎn) k=minimum(closedge,G); / 求出T的下一個(gè)結(jié)點(diǎn):第K頂點(diǎn) printf("(%s-%s)n",closedgek.adjvex,G.vexsk); / 輸出生成樹的邊 closedgek.lowcost=0;
22、 / 第K頂點(diǎn)并入U(xiǎn)集 for(j=0;j<G.vexnum;+j)if(G.arcskj.adj<closedgej.lowcost)/ 新頂點(diǎn)并入U(xiǎn)集后重新選擇最小邊 strcpy(closedgej.adjvex,G.vexsk);closedgej.lowcost=G.arcskj.adj;system("pause"); void main() /system("cls"); MGraph G; int xz; while(1) /system("cls"); printf("n");prin
23、tf("*管道鋪設(shè)最佳方案選擇*n"); printf(" 0 記錄保存為文件n"); printf(" 1 從文件中讀記錄n");printf(" 2 構(gòu)造無向網(wǎng)n "); printf(" 3 求出最小生成樹n"); printf(" 4 退出n");printf("*n"); printf(" 請(qǐng)輸入操作序號(hào)(0-4):n"); scanf("%d",&xz); switch(xz) case 0: wenjian();break; case 1: xianshi ();break; case 2: CreateAN(&G);break; case 3: MiniSpanTree_PRIM(G,G.vexs0);break; case 4: exit(0); default:printf("輸入無效指令!按任意鍵繼續(xù)!");system("paus
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版物業(yè)租賃合同模板
- 解除股份合同協(xié)議范本
- 購(gòu)房合同變投資入股協(xié)議
- 訂購(gòu)海外家具合同協(xié)議
- 貸后客服專員合同協(xié)議
- 訂立建設(shè)工程合同協(xié)議
- 環(huán)境友好包裝供應(yīng)合同(2篇)
- 2025標(biāo)準(zhǔn)購(gòu)房合同范本下載
- 財(cái)務(wù)會(huì)計(jì)實(shí)務(wù)考試要點(diǎn)
- 臨時(shí)租賃車輛合同
- 智能對(duì)話模型研究-全面剖析
- 考研英語03-12年真題譯文
- 放射住培結(jié)業(yè)考試試題題庫(kù)及答案
- 期中綜合模擬測(cè)試卷(含答案)-2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 精二類藥品培訓(xùn)大綱
- GB/T 27060-2025合格評(píng)定良好實(shí)踐指南
- PLC在洗衣機(jī)控制中的應(yīng)用實(shí)訓(xùn)報(bào)告
- 作物栽培學(xué)知到課后答案智慧樹章節(jié)測(cè)試答案2025年春中國(guó)農(nóng)業(yè)大學(xué)
- 知識(shí)產(chǎn)權(quán)的多元化投資方向分析
- 2024版跨境電商平臺(tái)與個(gè)人代理合作勞務(wù)合同2篇
- 全自動(dòng)灌裝機(jī)操作培訓(xùn)方案
評(píng)論
0/150
提交評(píng)論