《大话数据结构》之Kruskal算法

需要先对边按权重排序,或者每次要查找最小权重的边。同时用类似于数组链表的方式,记录每个顶点之间的连接关系。因为需要避免形成环路。

typedef struct 
{
	int begin;
	int end;
	int weight;
}Edge;

int Find(int *parent,int f)
{
	while(parent[f]>0)
	{
		f = parent[f];
	}
	return f;
}
void MiniSpanTree_Kruskal(MGraph G)
{
	int i,n,m;
	Edge edges[MAXEDGE];
	/*
	记录图中从任意一个点开始所能走到的最长路径,
	Find最终返回的是这个路径的终点,如果终点和新加入的边的另一个点重合,就表示他的加入会形成环路,
	新加入的边的两端就是环路的起点和终点
	*/
	int parent[MAXVEX];

	for(i=0;i<G.numVertexes;i++)
	{
		parent[i] = 0;
	}
	for(i=0;i<G.numEdges;i++)
	{
		n = Find(parent,edges[i].begin);
		m = Find(parent,edges[i].end);
		if(n!=m)
		{
			parent[n] = m;
			printf("(%d,%d) %d",edges[i].begin,edges[i].end,edges[i].weight);
		}
	}
}
个人觉得,这种Kruskal算法实现并不好:

1、需要先对边按权重排序;

2、edges数组中的begin和end需要按一定的规律记录,比如小的节点记录在begin中,大的节点记录在end中,或者反过来。如果记错了很容易出问题。




你可能感兴趣的:(算法,kruskal,大话数据结构)