kruskal算法,简单易懂

kruskal算法,基于并查集的实现

#define MaxSize 1000

typedef struct
{
	// 边的起点和终点序号
	int front, to;
	// 权值
	int weight;
}EdgeType;

// 边图结构体类
typedef struct
{
	// 顶点集
	int vertex[MaxSize];
	// 边集
	EdgeType edge[MaxSize]
	// 顶点个数
	int vertexnum;
	// 边个数
	int edgenum;
}EdgeGraph;

// kruskal算法 基于并查集的实现
void kruskal(EdgeGraph * G)
{
	// 双亲数组
	int parent[G->vertexnum];
	// 声明两个节点
	int vex1, vex2;
	// 顶点的循环变量
	int i
	// kruskal构造的边的个数,逐渐变大
	int num;
	// 初始化顶点的双亲,使得所有点成为离群点
	for(i = 0; i < G->vertexnum; i++){
		parent[i] = -1;
	}

	for(num = 0, i = 0; num < G-> edgenum; i++)
	{
		// 寻找该边的起始节点和终端节点的祖先根
		vex1 = FindRoot(parent, G->edge[i].from);
		vex2 = FindRoot(parent, G->edge[i].to);

		if(vex1 != vex2)
		{
			printf("从%d 到 %d 的边权值为%d\n", G->edge[i].from, G->edge[i].to, G->edge[i].weight);
			// 合并集合
			parent[vex2] = vex1;
			num++;
		}
	}
}

// 寻找v的祖先根
int FindRoot(int parent[], int v)
{
	int t = v;
	while(parent[t] != -1)
	{
		t = parent[t];
	}
	return t;
}

 

你可能感兴趣的:(数据结构)