1,问题描述
设G=(V,E)是无向连通带权图,如果G的一个子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树的各边权的总和称为该生成树的耗费,求在G的所有生成树中耗费最小的最小生成树。
2,算法思想
(1)将代价树中权值非0的所有的边进行小顶堆排序,依次存入到road[]数组中,然后将road[]进行倒置,注意在进行排序时,按照road[i]的权值进行排序,然后记录这条边的起始顶点也要相对应。
(2)从最小边开始扫描各边,并检测当前所选边的加入是否会构成回路,如果不会构成回路,则将该边并入到最小生成树中。
(3)不断重复步骤2,直到所有的边都检测完为止。
其中判断当前检测边的加入是否会使原来生成树构成回路的算法思想是:
取得顶点a根结点的算法实现为:
int GetRoot(int a){
while(a!=v[a]){
}
return a;
}
3程序设计
(1)所用数据结构,图的存储结构模块(nodetype.h)
#define maxSize 20
typedef struct{
}VertexType;
typedef struct{
}MGraph;
typedef struct{
}Road;
(2)主模块(main_Kruskal.cpp)
#include
#include
#include"nodetype.h"
#include"initlize.h"