標籤:
//Kruskal(克魯斯卡爾)演算法//楊鑫#include <stdio.h>#include <stdlib.h>#define MAX 1000#define MAXE MAX#define MAXV MAXtypedef struct{int beginvex1; //邊的起始頂點int endvex2; //邊的終止頂點int weight; //邊的權值}Edge;void kruskal(Edge E[],int n,int e){ int i,j,m1,m2,sn1,sn2,k;int vset[MAXV];for(i=1;i<=n;i++) //初始化輔助數組{vset[i]=i;} k=1; //表示當前構造最小產生樹的第k條邊,初值為1 j=0; //E中邊的下標,初值為0while(k < e) //判斷是否加入了最小產生樹中{ m1=E[j].beginvex1; m2=E[j].endvex2; //取一條邊的兩個鄰接點sn1=vset[m1];sn2=vset[m2]; //分別得到兩個頂點所屬的集合編號if(sn1 != sn2) //判斷是否有迴路{printf("(v%d,v%d): %d\n",m1,m2,E[j].weight);k++; //產生邊數增lif(k>=6) break;for(i=1;i<=n;i++) //兩個集合統一編號{ if (vset[i]==sn2) //集合編號為sn2的改為sn1 vset[i]=sn1;} } j++; //掃描下一條邊 }} int main(){Edge E[MAXE];int nume,numn;//這裡我寫死,下面可以自己輸入//printf("輸入邊數和頂數:\n");//scanf("%d%d",&nume,&numn);nume=10;numn=6;/*printf("請輸入各邊及對應的的權值(起始頂點 終止頂點 權值)\n");for(int i=0;i<nume;i++) scanf("%d%d%d",E[i].beginvex1,E[i].endvex2,E[i].weight);*///在這裡對輸入的資料進行排序,達到假設的要求,即:假設數組E存放圖G中的//所有邊,且邊已按權值從小到大的順序排列E[9].beginvex1=1;E[9].endvex2=2;E[9].weight=6;E[0].beginvex1=1;E[0].endvex2=3;E[0].weight=1;E[4].beginvex1=1;E[4].endvex2=4;E[4].weight=5;E[6].beginvex1=2;E[6].endvex2=3;E[6].weight=5;E[2].beginvex1=2;E[2].endvex2=5;E[2].weight=3;E[8].beginvex1=1;E[8].endvex2=2;E[8].weight=6;E[5].beginvex1=3;E[5].endvex2=4;E[5].weight=5;E[7].beginvex1=3;E[7].endvex2=5;E[7].weight=6;E[3].beginvex1=3;E[3].endvex2=6;E[3].weight=4;E[1].beginvex1=4;E[1].endvex2=6;E[1].weight=2;kruskal(E,numn,nume);return 0;}
結果:
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
資料結構之---C語言實現最小產生樹之kruskal(克魯斯卡爾)演算法