第十二周项目二

来源:互联网 发布:单片机hex文件反编译 编辑:程序博客网 时间:2024/06/07 04:17
  1. 烟台大学计算机学院  
  2.   
  3. 作者:王雪行

  4. 问题描述:Kruskal算法的验证 
  5.   
  6. 输入描述:无 
  7.   
  8. 输出描述:最小生成树的构成 
  9. 用到了graph.h 
  10.   
  11. */   
  12.   
  13.   
  14. #include <stdio.h>  
  15. #include <malloc.h>  
  16. #include "graph.h"  
  17. #define MaxSize 100  
  18. typedef struct  
  19. {  
  20.     int u;     //边的起始顶点  
  21.     int v;     //边的终止顶点  
  22.     int w;     //边的权值  
  23. } Edge;  
  24.   
  25. void InsertSort(Edge E[],int n) //对E[0..n-1]按递增有序进行直接插入排序  
  26. {  
  27.     int i,j;  
  28.     Edge temp;  
  29.     for (i=1; i<n; i++)  
  30.     {  
  31.         temp=E[i];  
  32.         j=i-1;              //从右向左在有序区E[0..i-1]中找E[i]的插入位置  
  33.         while (j>=0 && temp.w<E[j].w)  
  34.         {  
  35.             E[j+1]=E[j];    //将关键字大于E[i].w的记录后移  
  36.             j--;  
  37.         }  
  38.         E[j+1]=temp;        //在j+1处插入E[i]  
  39.     }  
  40. }  
  41.   
  42. void Kruskal(MGraph g)  
  43. {  
  44.     int i,j,u1,v1,sn1,sn2,k;  
  45.     int vset[MAXV];  
  46.     Edge E[MaxSize];    //存放所有边  
  47.     k=0;                //E数组的下标从0开始计  
  48.     for (i=0; i<g.n; i++)   //由g产生的边集E  
  49.         for (j=0; j<g.n; j++)  
  50.             if (g.edges[i][j]!=0 && g.edges[i][j]!=INF)  
  51.             {  
  52.                 E[k].u=i;  
  53.                 E[k].v=j;  
  54.                 E[k].w=g.edges[i][j];  
  55.                 k++;  
  56.             }  
  57.     InsertSort(E,g.e);      //采用直接插入排序对E数组按权值递增排序  
  58.     for (i=0; i<g.n; i++)   //初始化辅助数组  
  59.         vset[i]=i;  
  60.     k=1;    //k表示当前构造生成树的第几条边,初值为1  
  61.     j=0;    //E中边的下标,初值为0  
  62.     while (k<g.n)       //生成的边数小于n时循环  
  63.     {  
  64.         u1=E[j].u;  
  65.         v1=E[j].v;      //取一条边的头尾顶点  
  66.         sn1=vset[u1];  
  67.         sn2=vset[v1];   //分别得到两个顶点所属的集合编号  
  68.         if (sn1!=sn2)   //两顶点属于不同的集合  
  69.         {  
  70.             printf("  (%d,%d):%d\n",u1,v1,E[j].w);  
  71.             k++;                     //生成边数增1  
  72.             for (i=0; i<g.n; i++)   //两个集合统一编号  
  73.                 if (vset[i]==sn2)   //集合编号为sn2的改为sn1  
  74.                     vset[i]=sn1;  
  75.         }  
  76.         j++;               //扫描下一条边  
  77.     }  
  78. }  
  79.   
  80. int main()  
  81. {  
  82.     MGraph g;  
  83.     int A[6][6]=  
  84.     {  
  85.         {0,6,1,5,INF,INF},  
  86.         {6,0,5,INF,3,INF},  
  87.         {1,5,0,5,6,4},  
  88.         {5,INF,5,0,INF,2},  
  89.         {INF,3,6,INF,0,6},  
  90.         {INF,INF,4,2,6,0}  
  91.     };  
  92.     ArrayToMat(A[0], 6, g);  
  93.     printf("最小生成树构成:\n");  
  94.     Kruskal(g);  
  95.     return 0;  
  96. }  

运行结果:

原创粉丝点击