克鲁斯卡尔(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在现有的生成树中寻找这边上两个顶点连着的另一条边