1. 适用范围:
- 稀疏图中求最小生成树
2. 算法思想梗概:
- 保证不产生环的前提下, 在图中选出权值最小的, 顶点总数-1, 条边作为最小生成树的边
3. 在c语言中的实现:
梗概:
- 每纳入一条边前, 先判断是否会形成环
- use::判断是否形成环 代码:
typedef struct {
int start;
int end;
int weight;
}Edge;
Edge MinEdges[MAX_VERTEX_NUM];
int get_edges(Graph *G,Edge edges[]){}
void sort_edges(Edge edges[],int edgenum){}
int Kruskal(Graph *G, Edge MinEdges[]){
//把最小生成树的边都保存到MinEdges数组中
int i,n,m,k;
/*保存所生成树的所有边*/
Edge edges[MAX_VERTEX_NUM];
/*借助并查集*/
int parent[MAX_VERTEX_NUM];
/*获取图中所有边的所需信息*/
get_edges(G,edges);
/*升序排序*/
sort_edges(edges,G->arcnum);
/*初始并查集*/
for(i=0;i<G->vexnum;++i)
parent[i]=-1;
k=0;
for(i=0;i<G->arcnum;++i){
/*用并查集判断两顶点是否在同一颗树*/
n=Find(edges[i].start,parent);
m=Find(edges[i].end,parent);
if(n!=m){
parent[n]=m;//两顶点合为一个集
/*该边纳入生成树中*/
MinEdges[k].start=edges[i].start;
MinEdges[k].end=edges[i].end;
MinEdges[k].weight=edges[i].weight;
++k;
/*最小生成树条件达成*/
if(k==G->vexnum-1)return 1;
}
}
/*图中的边不足以生成树*/
if(k<G->vexnum-1)return 0;
}