Kruskal算法的設(shè)計(jì)和C實(shí)現(xiàn)_第1頁
Kruskal算法的設(shè)計(jì)和C實(shí)現(xiàn)_第2頁
Kruskal算法的設(shè)計(jì)和C實(shí)現(xiàn)_第3頁
Kruskal算法的設(shè)計(jì)和C實(shí)現(xiàn)_第4頁
Kruskal算法的設(shè)計(jì)和C實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)驗(yàn)三Kruskal算法的設(shè)計(jì)一、設(shè)計(jì)目的1.根據(jù)算法設(shè)計(jì)需要,掌握連通網(wǎng)的靈活表示方法;.掌握最小生成樹的Kruskal算法;.基本掌握貪心算法的一般設(shè)計(jì)方法;.進(jìn)一步掌握集合的表示與操作算法的應(yīng)用.二、設(shè)計(jì)內(nèi)容1.主要數(shù)據(jù)類型與變量typedefstruct{intnum;inttag;}NODE;typedefstruct{intcost;intnode1;intnode2;}EDGE;NODEset[N];/*節(jié)點(diǎn)集*/EDGEes[N];/*邊集*/EDGEst[N];/*最小生成樹的邊集*/2.算法或程序模塊intFind(NODE*set,intelem)功能:在數(shù)組set中順序查找元素elem,使用帶壓縮規(guī)則的查找算法,返回所在子集的根節(jié)點(diǎn)索引.intUnion(NODE*set,intelem1,intelem2)功能:應(yīng)用Find算法首先找到elemi和elem2所在的子集,然后應(yīng)用帶加權(quán)規(guī)則的并運(yùn)算算法合并兩個(gè)子集.不成功時(shí),返回-1;否則,返回并集的根節(jié)點(diǎn)索引.intInsertSort(EDGE*dat,intn)功能:用插入分類算法將連通圖的邊集按成本值的非降次序分類.intKruskal(EDGE*es,NODE*set,intlength,EDGE*st,intnum)功能:對(duì)有l(wèi)ength條權(quán)值大于0的邊,最小生成樹中有num條邊的連通圖,應(yīng)用Kruskal算法生成最小生成樹,最小生成樹的邊存儲(chǔ)在數(shù)組st中.voidOutput(EDGE*st,intn)

功能:輸出最小生成樹的各條邊.三測(cè)試結(jié)果 、測(cè)試數(shù)據(jù)和結(jié)果1C:\llsers\wxz\Deslb:op\5hiyan?ese碁不相鄰則輸入T=4<—>6=205<—>6-55當(dāng)主it也山邊也山邊也山邊也勺也也力邊.■TL.11K. ;「:-「J. I.■.■-1■.1-1.■.1IT—.—-1.■.11.-■Ti.1C:\Users\wxz\Deslctop\5hiyan.ese權(quán)恒排序結(jié)果l升序》:10IE20 25 30 35 40 45 50 55最小權(quán)值邊和:nincost=185聶小樹的邊數(shù);5最小生成樹的為:1234512345樹的表示:set[01.rum=lset[11樹的表示:set[01.rum=lset[11.rum=2set[21=rmm=3se七[3]■riurn^4setL41.rum=5settS1.ru,m=6setL0Ktag=2set[1]-tag=0set[2J=ta?j=—6:st:七[3]-tagr-2set14J.tag=Zset[5J.tag=2測(cè)試數(shù)據(jù)和結(jié)果2回回IfC:\Users\wxz\Desktop\shiy3n.eie詩觸人結(jié)點(diǎn)彳沖羅人邊的權(quán)值,若不碗輸入-1邊:K—>2=15遠(yuǎn)K—>3=20遠(yuǎn)K—>4=7ffi;K—>5=-1迅2<—>3=-1陋:2<—>4=28迅:2<—>5=3遠(yuǎn)3<—>4=30遠(yuǎn)3<—>5=-1遠(yuǎn)4<—>5=8.附:程序模塊的源代碼#include<stdio.h>#include<conio.h>#defineN100intlength;typedefstruct{intnum;inttag;}NODE;typedefstruct{intcost;intnode1;intnode2;}EDGE;NODEset[N];/*節(jié)點(diǎn)集,n為連通網(wǎng)的節(jié)點(diǎn)數(shù)*/EDGEes[N];/*邊集,m為連通網(wǎng)的邊數(shù)*/EDGEst[N];/*最小生成樹的邊集*/intInsertSort(EDGE*dat,intn){inti,item,j,m,h;for(i=0;i<n;i++){item=dat[i].cost;m=dat[i].node1;h=dat[i].node2;if(i==0){j=0;dat[j].cost=item;}else{j=i-1;while((item<dat[j].cost)&&(j>=0)){dat[j+1].cost=dat[j].cost;dat[j+1].node1=dat[j].node1;dat[j+1].node2=dat[j].node2;j--;}

dat[j+1].cost=item;

dat[j+1].node1=m;

dat[j+1].node2=h;}}printf("權(quán)值排序結(jié)果(升序):\n");for(i=0;i<n;i++)printf("%4d",dat[i].cost);printf("\n\n");intFind(NODE*set,intelem){inti,j,k;i=elem;while(set[i].tag>=0){i=set[i].tag;}j=elem;while(j!=i){k=set[j].tag;set[j].tag=i;j=k;}returni;}intUnion(NODE*set,intelem1,intelem2){intm,n,sum;m=Find(set,elem1);n=Find(set,elem2);sum=set[m].tag+set[n].tag;if(set[m].tag>set[n].tag){set[n].tag=sum;set[m].tag=n;}else{set[m].tag=sum;set[n].tag=m;}}intQuquanzhi(EDGE*es,intn){inti,j=0,len;EDGEb[N];for(i=0;i<=n;i++){if(es[i].cost>0){b[j].cost=es[i].cost;b[j].node1=es[i].node1;b[j].node2=es[i].node2;j++;}}len=j;printf("\n");for(i=0;i<len;i++){es[i].cost=b[i].cost;es[i].node1=b[i].node1;es[i].node2=b[i].node2;}printf("\n");returnlen;intKruskal(EDGE*es,NODE*set,intlength,EDGE*st,intnum){inti,j,k=1,m,n,mincost=0;st[0].cost=es[0].cost;st[0].node1=es[0].node1;st[0].node2=es[0].node2;m=Find(set,st[0].node1);n=Find(set,st[0].node2);Union(set,m,n);mincost+=es[0].cost;for(i=1;i<length;i++)/*找其他邊*/{m=Find(set,es[i].node1);n=Find(set,es[i].node2);if(m!=n){Union(set,m,n);st[k].cost=es[i].cost;st[k].node1=es[i].node1;st[k].node2=es[i].node2;mincost+=es[i].cost;k++;}if(k==num)break;}printf("\n最小權(quán)值邊和:mincost=%d\n",mincost);printf("\n最小樹的邊數(shù):%d\n\n",k);returnk;}voidOutput(EDGE*st,intn){inti;printf("最小生成樹的為:\n\n");for(i=0;i<n;i++){printf("邊%4:%3dv-->%d=%d\n",i+1,st[i]?node1+1,st[i]?node2+1,st[i]?cost);}intmain()inti,j,k=0,L,temp,len;NODE*p,*q;textbackground(BLUE);textcolor(YELLOW);system("graftabl935");/*顯示中文必須的代碼*/clrscr();printf("請(qǐng)輸入結(jié)點(diǎn)個(gè)數(shù):”);scanf("%d",&length);for(i=0;i<length;i++){set[i].num=i;set[i].tag=-1;}printf("請(qǐng)輸入邊的權(quán)值,若不相鄰則輸入-1\n");for(i=0;i<length;i++){for(j=i+1;j<length;j++){ printf("邊:%dv-->%d=",i+1j+1);scanf("%d",&es[k].cost);es[k].node1=i;es[k].node2=j;k++;}}temp=k;L=Ququanzhi(es,temp);/*提出權(quán)值大于0的邊數(shù)*/InsertSort(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論