最小生成树kruskal算法、

克鲁斯卡尔(kruskal)

 

 1 //kruskal算法生成最小生成树、
 2 
 3 //对边集数组Edge结构的定义
 4 typedef struct
 5 {
 6     int begin;
 7     int end;
 8     int weight;
 9 }Edge; 
10 void Minispantree_kruskal(Mgraph G)
11 {
12     int i,n,m;
13     Edge edges[MAXEDGE];        //最大边数 、 
14     int parent[MAXVEX];            //最大顶点数、
15     //此处省虐将邻接矩阵G转化为边集数组edges并按权值由小到大排序生成的代码
16     for(i=0;i<G.numVertexes;++i)
17         parent[i]=0;
18     for(i=0;i<G.numEdges;++i)
19     {
20         n=find();
21         m=find(parent,edges[i].end);
22         if(n!=m){        // 说明此边没有与现有的生成树形成环路 
23             parent[n]=m;        //将此边的结尾顶点放入下标为起点的parent中
24                                 //表示此顶点已经在生成树集合中
25             printf("(%d,%d)%d",edges[i].begin,edges[i].end,edges[i].weight);
26         }
27      }
28 }
29 int find(int *parent,int f)
30 {
31     while(parent[f]>0)
32         f=parent[f];
33     return f;
34 }

 

个人理解:感觉难点就在理解find函数和parent数组,parent数组和find的函数实际上呢就是在找此边的前端(也可以说是另一边),

比如edges[i],begin和edges[i].end在现有的生成树中寻找这边上两个顶点连着的另一条边

posted @ 2016-02-16 10:05  我不萌、我要高冷  阅读(478)  评论(0编辑  收藏  举报