資源描述:
《用Kruskal算法求無向圖的最小生成樹.doc》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、用Kruskal算法求無向圖的最小生成樹該圖用鄰接矩陣表示,鄰接表原理與之相同??梢灾赋龅氖牵瑢τ谟邢驁D,算法可以做得更加簡單,因為對無向圖的“回邊”情況的處理比有向圖回邊情況的處理要復雜一些。圖1:輸入示例圖二:輸入時若兩點之間沒有公共邊,則將權值設置為-1。程序設置處理的最大點數為10。圖三:注意到Kruskal算法的解答結果有時候不是唯一的,這個結果和對圖遍歷時的順序有關,但是必需注意的是所有的最小生成樹其網絡代價和是一樣的。下面是源代碼:/*Kruskal.c?Copyright(c)2002,2006byctu
2、_85AllRightsReserved.*//*Iamsorrytosaythatthesituationofunconnectedgraphisnotconcerned*/#include"stdio.h"#definemaxver10#definemaxright100intG[maxver][maxver],record=0,touched[maxver][maxver];intcircle=0;intFindCircle(int,int,int,int);intmain(){intpath[maxver][2]
3、,used[maxver][maxver];inti,j,k,t,min=maxright,exsit=0;intv1,v2,num,temp,status=0;restart:printf("Pleaseenterthenumberofvertex(s)inthegraph:");scanf("%d",&num);if(num>maxver
4、
5、num<0){printf("Error!Pleasereinput!");gotorestart;}for(j=0;j6、+){if(j==k){G[j][k]=maxright;used[j][k]=1;touched[j][k]=0;}elseif(j=maxright
7、
8、temp<-1){printf("Invalidinput!");gotore;}if(temp==-1)te
9、mp=maxright;G[j][k]=G[k][j]=temp;used[j][k]=used[k][j]=0;touched[j][k]=touched[k][j]=0;}}for(j=0;j10、++){for(j=0;j11、ath[t][0]);if(circle){/*ifacircleexsits,rollback*/circle=0;i--;exsit=0;touched[v1][v2]=0;touched[v2][v1]=0;min=maxright;}else{record++;min=maxright;}}}if(!status)printf("Wecannotdealwithitbecausethegraphisnotconnected!");else{for(i=0;i12、vertex%dtovertex%d",i+1,path[i][0]+1,path[i][1]+1);}return1;}intFindCircle(intstart,intbegin,inttimes,intpre){/*tojudgewhetheracircleisproduced*/inti;for(i=0