版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p><b> 一、問(wèn)題描述1</b></p><p> 二、需求分析與設(shè)計(jì)1</p><p> 1、 基本信息(包括頂點(diǎn)數(shù)、邊數(shù)、權(quán)值等)。1</p><p> 2、 實(shí)現(xiàn)功能(城市之間距離、最小距離、最大值等)。1</p
2、><p> 三、兩種算法比較1</p><p> ?。ㄒ唬?、普里姆(Prim)算法:1</p><p> ?。ǘ?克魯斯卡(Kruskal)算法:1</p><p> 四、 算法的設(shè)計(jì)思想1</p><p> 求圖的最小生成樹(shù)主要有兩種方法:1</p><p> (一)、算法
3、的相同點(diǎn):1</p><p> (二)、算法的不同點(diǎn):2</p><p><b> 六、總結(jié)4</b></p><p><b> 七 源代碼5</b></p><p><b> 最小生成樹(shù)</b></p><p><b> 一
4、、問(wèn)題描述</b></p><p> 為了解決在n個(gè)城市之間建設(shè)網(wǎng)絡(luò),但需要保證連通,求最經(jīng)濟(jì)的架設(shè)方法;因此利用了最小生成樹(shù)的兩種算法Prim算法和kruskal算法,從而來(lái)解決此問(wèn)題。</p><p><b> 二、需求分析與設(shè)計(jì)</b></p><p> 可以計(jì)算出兩城市之間的距離、可以計(jì)算出城市之間最小距離。
5、 </p><p> 基本信息(包括頂點(diǎn)數(shù)、邊數(shù)、權(quán)值等)。</p><p> 實(shí)現(xiàn)功能(城市之間距離、最小距離、最大值等)。</p><p><b> 三、兩種算法比較</b></p><p> 、普里姆(Prim)算法:</p><p> 普利姆算法的時(shí)間復(fù)雜度為O(n2),與
6、網(wǎng)中的邊數(shù)無(wú)關(guān)因此適用于求邊稠密的網(wǎng)的最小生成樹(shù)。</p><p> ?。ǘ?、 克魯斯卡(Kruskal)算法:</p><p> 克魯斯卡算法恰恰相反,它的時(shí)間復(fù)雜度為O(eloge)(e為網(wǎng)中的邊的數(shù)目)。因此它適用稀疏的網(wǎng)的最小生成樹(shù)。</p><p><b> 算法的設(shè)計(jì)思想</b></p><p>
7、求圖的最小生成樹(shù)主要有兩種方法:</p><p><b> 1. 普里姆算法;</b></p><p><b> 2.克魯斯卡算法。</b></p><p> (一)、算法的相同點(diǎn):</p><p> 都利用了頂點(diǎn)集U和V-U中頂點(diǎn)的最小值;都有一出發(fā)點(diǎn);每次都是選出最小的值并入U中以作為過(guò)
8、渡頂點(diǎn),而不再求其最??;都涉及最短問(wèn)題;它們都是從一個(gè)原始頂點(diǎn)開(kāi)始將頂點(diǎn)一個(gè)個(gè)按一定順序轉(zhuǎn)移到所求終點(diǎn)中都用到了輔助向量;都從頂點(diǎn)出發(fā),并在過(guò)程中都依據(jù)了頂點(diǎn);都包含其頂點(diǎn)連通分量;都是對(duì)網(wǎng)進(jìn)行操作;用找到的路徑將頂點(diǎn)連接起來(lái)都是樹(shù)。</p><p> (二)、算法的不同點(diǎn):</p><p> 普里姆算法從頂點(diǎn)集U中任一頂點(diǎn)出發(fā)到V—U中頂點(diǎn),迪杰斯特拉算法從源點(diǎn)出發(fā)通過(guò)頂點(diǎn)U到找到V
9、—U中頂點(diǎn)的最小值;普里姆算法的出發(fā)點(diǎn)是算法的開(kāi)始點(diǎn);而迪杰斯特拉算法的出發(fā)點(diǎn)是求最短路徑的源點(diǎn);普里姆算法用lowcost數(shù)組,而迪杰斯特拉算法用D[ j ]=Min{D[ i ]|vi屬于頂點(diǎn)集V-S}普里姆算法解決最小生成樹(shù),迪杰斯特拉算法解決最短路徑;普里姆算法是順著已找到的頂點(diǎn)找其余應(yīng)并入U中的頂點(diǎn),而迪杰斯特拉算是順著頂點(diǎn)去找其余頂點(diǎn)到源點(diǎn)的最短路徑;普里姆算法的最短是兩個(gè)頂點(diǎn)集間的最短,而迪杰斯特拉算法的最短是某點(diǎn)通過(guò)一個(gè)
10、頂點(diǎn)集U到源點(diǎn)的最短。普里姆算法的最短是兩個(gè)頂點(diǎn)間的最短,而迪杰斯特拉算法的最短是某點(diǎn)到源點(diǎn)的最短。普法無(wú)需按最短的并入,它尋找并入U(xiǎn)的點(diǎn)的依據(jù)是在U和V-U之間的最短路徑。迪法在找到最短路徑后,還要對(duì)其余結(jié)點(diǎn)的當(dāng)前最短路徑進(jìn)行修改,而普法則不進(jìn)行修改。普法是從頂點(diǎn)集的思路出發(fā),而迪法則是按路徑長(zhǎng)度遞增思路出發(fā)。普法的出發(fā)點(diǎn)是任意的,而迪法的出發(fā)點(diǎn)是規(guī)定的。</p><p> 普法在執(zhí)行過(guò)程中不改變兩點(diǎn)間的權(quán)值
11、,而迪法在執(zhí)行過(guò)程中會(huì)求出一個(gè)或者是兩點(diǎn)的權(quán)值或者是權(quán)值之和作為最短的路徑;迪法具有方向性,而普法則可以不具有.</p><p><b> 系統(tǒng)測(cè)試</b></p><p> /*建立圖的鄰接矩陣*/</p><p> void CreatMatrix(adjmatrix GA){</p><p> int i,
12、j,k,e;</p><p> printf("圖中有%d個(gè)頂點(diǎn)\n",n);</p><p> for(i=1;i<=n;i++){</p><p> for(j=1;j<=n;j++){</p><p><b> if(i==j){</b></p><p&g
13、t; GA[i][j]=0; /*對(duì)角線(xiàn)的值置為0*/</p><p><b> }</b></p><p><b> else{</b></p><p> GA[i][j]=MaxNum; /*其它位置的值置初始化為一個(gè)最大整數(shù)*/</p><p><b>
14、 }</b></p><p><b> }</b></p><p><b> }</b></p><p> printf("請(qǐng)輸入邊的個(gè)數(shù):");</p><p> scanf("%d",&arcnum);</p>
15、<p> printf("請(qǐng)輸入邊的信息,按照起點(diǎn),終點(diǎn),權(quán)值的形式輸入:\n");</p><p> for(k=1;k<=arcnum;k++){</p><p> scanf("%d,%d,%d",&i,&j,&e); /*讀入邊的信息*/</p><p> GA[i][
16、j]=e;</p><p> GA[j][i]=e;</p><p><b> }</b></p><p><b> }</b></p><p><b> 測(cè)試結(jié)果:</b></p><p><b> 六、總結(jié)</b>&l
17、t;/p><p> 編程要很強(qiáng)的邏輯思維,難度很大,但通過(guò)這次的自己親自動(dòng)手完成課程設(shè)計(jì)后,我懂得難度很多時(shí)候是因?yàn)槲覀冏约合胂胨请y的。如果我們一開(kāi)始就把它想象的很難,就會(huì)有心理的一種暗示,這個(gè)我是不會(huì)完成的。但是只要我們有信心,克服這種心里的障礙就一定能編寫(xiě)一個(gè)好程序。所以心態(tài)很重要。通過(guò)這次課程設(shè)計(jì),發(fā)現(xiàn)自己對(duì)知識(shí)的掌握上還是有很多欠缺的。最主要的不足之處就是再把算法的思想用程序語(yǔ)言編寫(xiě)出來(lái),這個(gè)對(duì)我來(lái)說(shuō)有很
18、大的難度。針對(duì)這種情況可能是我平時(shí)看程序不夠多,自己練得很不夠。還有就是對(duì)于圖的存儲(chǔ)上我不是很了解,以前總是覺(jué)得圖的存儲(chǔ)有太多的方法,對(duì)于在不同種情況下該用什么樣的方法自己不太了解,對(duì)于它們的特點(diǎn)沒(méi)有深入的了解,但通過(guò)這次自己在實(shí)際當(dāng)中的練習(xí),對(duì)于它們有了更深層次的認(rèn)識(shí)。通過(guò)這次的課程設(shè)計(jì)要我們明白了,編程只有我們有信心,就一定能完成。</p><p><b> 七 源代碼</b><
19、/p><p> #include <stdio.h></p><p> #include<stdlib.h> </p><p> #define n 7</p><p> #define MaxNum 10000 /*定義一個(gè)最大整數(shù)*/</p><p> /*定義鄰接矩陣類(lèi)型*/<
20、;/p><p> typedef int adjmatrix[n+1][n+1]; /*0號(hào)單元沒(méi)用*/</p><p> typedef struct{</p><p> int fromvex,tovex;</p><p> int weight;</p><p><b> }Edges;<
21、;/b></p><p> typedef Edges *EdgeNode;</p><p> int arcnum; /*邊的個(gè)數(shù)*/</p><p> typedef struct </p><p> {
22、 </p><p> char v1; </p><p> char v2;
23、 </p><p> int weight; </p><p> }Edge; </p><
24、p> typedef struct{ </p><p> Edge space[100]; </p><p> int Elength;
25、 </p><p> }Headtype; </p><p> typedef struct <
26、/p><p> { </p><p> char v; </p><p> int flag;
27、 </p><p><b> }Dgree;</b></p><p> typedef struct{ </p><p> Dgree biao[20];</p><p> int Glength;</p>
28、<p><b> }Mark;</b></p><p> /*建立圖的鄰接矩陣*/</p><p> void CreatMatrix(adjmatrix GA){</p><p> int i,j,k,e;</p><p> printf("圖中有%d個(gè)頂點(diǎn)\n",n);<
29、/p><p> for(i=1;i<=n;i++){</p><p> for(j=1;j<=n;j++){</p><p><b> if(i==j){</b></p><p> GA[i][j]=0; /*對(duì)角線(xiàn)的值置為0*/</p><p><b>
30、 }</b></p><p><b> else{</b></p><p> GA[i][j]=MaxNum; /*其它位置的值置初始化為一個(gè)最大整數(shù)*/</p><p><b> }</b></p><p><b> }</b></p>
31、<p><b> }</b></p><p> printf("請(qǐng)輸入邊的個(gè)數(shù):");</p><p> scanf("%d",&arcnum);</p><p> printf("請(qǐng)輸入邊的信息,按照起點(diǎn),終點(diǎn),權(quán)值的形式輸入:\n");</p&g
32、t;<p> for(k=1;k<=arcnum;k++){</p><p> scanf("%d,%d,%d",&i,&j,&e); /*讀入邊的信息*/</p><p> GA[i][j]=e;</p><p> GA[j][i]=e;</p><p><b&
33、gt; }</b></p><p><b> }</b></p><p> /*初始化圖的邊集數(shù)組*/</p><p> void InitEdge(EdgeNode GE,int m){</p><p><b> int i;</b></p><p>
34、 for(i=1;i<=m;i++){</p><p> GE[i].weight=0;</p><p><b> }</b></p><p><b> }</b></p><p> /*根據(jù)圖的鄰接矩陣生成圖的邊集數(shù)組*/</p><p> void Ge
35、tEdgeSet(adjmatrix GA,EdgeNode GE){</p><p> int i,j,k=1;</p><p> for(i=1;i<=n;i++){</p><p> for(j=i+1;j<=n;j++){</p><p> if(GA[i][j]!=0&&GA[i][j]!=Max
36、Num){</p><p> GE[k].fromvex=i;</p><p> GE[k].tovex=j;</p><p> GE[k].weight=GA[i][j];</p><p><b> k++;</b></p><p><b> }</b></
37、p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*按升序排列圖的邊集數(shù)組*/</p><p> void SortEdge(EdgeNode GE,int m){&l
38、t;/p><p> int i,j,k;</p><p> Edges temp;</p><p> for(i=1;i<m;i++){</p><p><b> k=i;</b></p><p> for(j=i+1;j<=m;j++){</p><p>
39、; if(GE[k].weight>GE[j].weight){</p><p><b> k=j;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> if(k!=i){</b>&
40、lt;/p><p> temp=GE[i];GE[i]=GE[k];</p><p> GE[k]=temp;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
41、<p> /*利用普里姆算法從初始點(diǎn)v出發(fā)求鄰接矩陣表示的圖的最小生成樹(shù)*/</p><p> void Prim(adjmatrix GA,EdgeNode T){</p><p> int i,j,k,min,u,m,w;</p><p> Edges temp;</p><p> /*給T賦初值,對(duì)應(yīng)為v1依次到其余
42、各頂點(diǎn)的邊*/</p><p><b> k=1;</b></p><p> for(i=1;i<=n;i++){</p><p><b> if(i!=1){</b></p><p> T[k].fromvex=1;</p><p> T[k].tovex=
43、i;</p><p> T[k].weight=GA[1][i];</p><p><b> k++;</b></p><p><b> }</b></p><p><b> }</b></p><p> /*進(jìn)行n-1次循環(huán),每次求出最小生成
44、樹(shù)中的第k條邊*/</p><p> for(k=1;k<n;k++){</p><p> min=MaxNum;</p><p><b> m=k;</b></p><p> for(j=k;j<n;j++){</p><p> if(T[j].weight<min)
45、{</p><p> min=T[j].weight;m=j;</p><p><b> }</b></p><p><b> }</b></p><p> /*把最短邊對(duì)調(diào)到k-1下標(biāo)位置*/</p><p> temp=T[k];</p><
46、p> T[k]=T[m];</p><p> T[m]=temp;</p><p> /*把新加入最小生成樹(shù)T中的頂點(diǎn)序號(hào)賦給j*/</p><p> j=T[k].tovex;</p><p> /*修改有關(guān)邊,使T中到T外的每一個(gè)頂點(diǎn)保持一條到目前為止最短的邊*/</p><p> for(i=k
47、+1;i<n;i++){</p><p> u=T[i].tovex;</p><p> w=GA[j][u];</p><p> if(w<T[i].weight){</p><p> T[i].weight=w;T[i].fromvex=j;</p><p><b> }</b
48、></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*輸出邊集數(shù)組的每條邊*/</p><p> void OutEdge(EdgeNode GE,in
49、t e){</p><p><b> int i;</b></p><p> printf("按照起點(diǎn),終點(diǎn),權(quán)值的形式輸出的最小生成樹(shù)為:\n");</p><p> for(i=1;i<=e;i++){</p><p> printf("%d,%d,%d\n",G
50、E[i].fromvex,GE[i].tovex,GE[i].weight);</p><p><b> }</b></p><p><b> }</b></p><p> void InitMark(Mark &M,int x){</p><p><b> int j;
51、</b></p><p> M.Glength=x; </p><p> printf("請(qǐng)依次輸入這些點(diǎn):"); </p><p> for(j=1;j<=x;j++)
52、 </p><p> { </p><p> scanf("%s",&M.biao[j].v);
53、 </p><p> M.biao[j].flag=-1; </p><p> } </p><p> }
54、 </p><p> void InitHeadType(Headtype &H,int y){</p><p><b> int k; </b></p><p> H.Elength=y;
55、 </p><p> for(k=1;k<=y;k++) </p><p> { </p><p> p
56、rintf("請(qǐng)輸入邊的關(guān)系:"); </p><p> scanf("%s%s%d",&H.space[k].v1,&H.space[k].v2,&H.space[k].weight); </p><p> }
57、 </p><p> } </p><p> void HeadAdjust(Headtype &H,int s,int m)
58、 </p><p> {Edge rc; </p><p> int p; </p>&
59、lt;p> rc=H.space[s]; </p><p> for(p=2*s;p<=m;p*=2) </p><p> {
60、 </p><p> if(p<m&&(H.space[p].weight<H.space[p+1].weight)) </p><p> ++p;
61、 </p><p> if(rc.weight>H.space[p].weight) </p><p> break; </p><p>
62、H.space[s]=H.space[p]; </p><p> s=p; </p><p> }
63、 </p><p> H.space[s]=rc; </p><p> }
64、 </p><p> void HeadSort(Headtype &H)
65、 </p><p><b> {int q; </b></p><p> Edge rb; </p><p> for(q=H.Elength/2;q>0;--q)
66、 </p><p> HeadAdjust(H,q,H.Elength); </p><p> for(q=H.Elength;q>1;--q) </p><p&
67、gt; { </p><p> rb=H.space[1]; </p><p> H.space[1]=H.space[q];
68、 </p><p> H.space[q]=rb; </p><p> HeadAdjust(H,1,q-1); </p><p>
69、 } </p><p> } </p><p> void main()</p><p><b> {</b></p><p><b>
70、 int q;</b></p><p><b> do</b></p><p><b> {</b></p><p> printf("*******************************************************\n");</p>&l
71、t;p> printf("1. 普里姆算法最小生成樹(shù)算法! \n");</p><p> printf("2. 克魯斯卡爾算法最小生成樹(shù)算法! \n");</p><p> printf("\n********************
72、*********************************\n");</p><p> printf(" 制 作 人: 岳 忠 全 \n");</p><p> printf(" 班 級(jí) : 網(wǎng) 絡(luò) 工 程 班
73、\n");</p><p> printf(" 時(shí) 間 : 2013.12.24 \n"); </p><p> printf("\n**************************************************** \n");</p>
74、;<p> printf("\n**************** 請(qǐng)選擇要進(jìn)行的操:! ************** \n");</p><p> scanf("%d",&q);</p><p><b> switch(q)</b></p><p><b> {
75、</b></p><p><b> case 1:</b></p><p> adjmatrix GA;</p><p> Edges GE[n*(n-1)/2],T[n];</p><p> CreatMatrix(GA);</p><p> InitEdge(GE,arc
76、num);</p><p> GetEdgeSet(GA,GE);</p><p> SortEdge(GE,arcnum);</p><p> Prim(GA,T);</p><p> printf("\n");</p><p> OutEdge(T,n-1);</p>&
77、lt;p><b> break;</b></p><p><b> case 2:</b></p><p> int Gnumber,Enumber,a,b,c; </p><p> printf("請(qǐng)輸入點(diǎn)的個(gè)數(shù):\n&q
78、uot;); </p><p> scanf("%d",&Gnumber); </p><p> printf("請(qǐng)輸入邊數(shù):");
79、 </p><p> scanf("%d",&Enumber); </p><p> Headtype H; </
80、p><p><b> Mark M; </b></p><p> Dgree e1,e2; </p><p> InitMark(M,Gnumber
81、); </p><p> InitHeadType(H,Enumber); </p><p> HeadSort(H);
82、 </p><p> printf("輸出最小生成樹(shù);\n"); </p><p> for(a
83、=1;a<=Enumber;a++) </p><p> { </p><p> for(b=1;b<=Gnumber;b++)</p><
84、p><b> {</b></p><p> if(M.biao[b].v==H.space[a].v1) </p><p><b> {</b></p><p> e1=M.biao[b]; </p><p&g
85、t;<b> break;</b></p><p><b> }</b></p><p> } </p><p> for(c=1;c<=Gnumber;c++)</p><p> {
86、 </p><p> if(M.biao[c].v==H.space[a].v2) </p><p><b> {</b></p><p> e2=M.biao[c]; </p&
87、gt;<p><b> break;</b></p><p><b> } </b></p><p> }
88、 </p><p> while(e1.flag!=-1)</p><p><b> {</b></p><p> b=e1.flag; </p&
89、gt;<p> e1=M.biao[e1.flag];</p><p> } </p><p> while(e2.flag!=-1)</p><p><b> {</b></p><p> c=e2
90、.flag; </p><p> e2=M.biao[e2.flag]; </p><p> } </p><p> if(e2.v!=e1.v)</p>
91、<p><b> { </b></p><p> M.biao[b].flag=c; </p><p> printf("(%c,%c):%d\n",H.space[a].v1,
92、H.space[a].v2,H.space[a].weight); </p><p><b> }</b></p><p> } break; </p><p><b> }</b></p><p> }while(q!=2);</p>&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 最小生成樹(shù)課程設(shè)計(jì)
- 最小生成樹(shù)課程設(shè)計(jì)
- 最小生成樹(shù)課程設(shè)計(jì)
- 最小生成樹(shù)求解課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--最小生成樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-最小生成樹(shù)
- 普里姆算法生成最小生成樹(shù)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-最小生成樹(shù)問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--最小生成樹(shù)
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--最小生成樹(shù)問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---最小生成樹(shù)問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)java--最小生成樹(shù)
- 課程設(shè)計(jì)---克魯斯卡爾算法求最小生成樹(shù)
- 4最小生成樹(shù)
- 4最小生成樹(shù)
- 最小生成樹(shù)算法及應(yīng)用
- 度約束最小生成樹(shù)算法.pdf
- 最小生成樹(shù)算法及其應(yīng)用【開(kāi)題報(bào)告】
- 最小生成樹(shù)算法及其應(yīng)用【文獻(xiàn)綜述】
- 約束最小生成樹(shù)算法的研究.pdf
評(píng)論
0/150
提交評(píng)論