克鲁斯卡尔算法

  1. #include <stdio.h>
  2. #define MAXVEX 100
  3. typedef struct
  4. {
  5. int u; /*边的起始顶点*/
  6. int v; /*边的终止顶点*/
  7. int w; /*边的权值*/
  8. } Edge;
  9. void Kruskal(Edge E[],int n,int e)
  10. {
  11. int i,j,m1,m2,sn1,sn2,k;
  12. int vset[MAXVEX];
  13. for (i=0;i<n;i++) vset[i]=i; /*初始化辅助数组*/
  14. k=1; /*k表示构造最小生成树的第几条边,初值为1*/
  15. j=0; /*E中边的下标,初值为0*/
  16. while (k<n) /*生成的边数小于n时循环*/
  17. {
  18. m1=E[j].u;m2=E[j].v; /*取一条边的头尾顶点*/
  19. sn1=vset[m1];sn2=vset[m2]; /*分别得到两个顶点所属的集合编号*/
  20. if (sn1!=sn2) /*两顶点属不同的集合,该边是最小生成树的边*/
  21. {
  22. printf(" 边(%d,%d)权为:%d\n",m1,m2,E[j].w);
  23. k++; /*生成边数增1*/
  24. for (i=0;i<n;i++) /*两个集合统一编号*/
  25. if (vset[i]==sn2) /*集合编号为sn2的改为sn1*/
  26. vset[i]=sn1;
  27. }
  28. j++; /*扫描下一条边*/
  29. }
  30. }
  31. void main()
  32. {
  33. int n=7,e=10;
  34. Edge E[]={
  35. {3,5,30},{1,4,40},{3,6,42},
  36. {2,6,45},{0,1,50},{3,4,50},
  37. {2,3,52},{0,2,60},{1,3,65},
  38. {4,5,70}};
  39. printf("最小生成树:\n");Kruskal(E,n,e);
  40. }