树与等价问题

typedef struct {
	TElemType data;
	int parent;
}PTNode;
typedef struct {
	PTNode nodes[MAX_TREE_SIZE];
	int r, n;//根结点所在位置和结点数
}PTree;
typedef PTree MFset;

查找i所属子集

int find_mfset(MFset S, int i)
{
	int j;
	if (i<1 || i>S.n)
		return -1;
	for (j = i; S.nodes[j].parent > 0; j = S.nodes[j].parent);
	return j;
}

集合的并

int merge_mfset(MFset& S, int i, int j)
{
	if (i<1 || i>S.n || j<1 || j>S.n)
		return -1;
	S.nodes[i].parent = j;
	return 1;
}

  改进并操作算法,令成员较少的子集树指向成员较多的子集树的根;令根的parent为存储子集中所含成员数目的负值。

int min_mfset(MFset& S, int i, int j)
{
	if (i<1 || i>S.n || j<1 || j>S.n)
		return -1;
	if (S.nodes[i].parent < S.nodes[j].parent)
	{
		S.nodes[j].parent = i;
		S.nodes[i].parent += S.nodes[j].parent;
	}
	else
	{
		S.nodes[i].parent = j;
		S.nodes[j].parent += S.nodes[i].parent;
	}
	return 1;
}

  改进查找子集算法,当所查找的元素i不在树的第二层,在算法中增添一个压缩路径的功能,即将所有从根到元素i路径上的元素都变成树根的孩子

int mix_mfset(MFset& S, int i)
{
	int i, j, k, t;
	if (i<1 || i>S.n)
		return -1;
	for (j = i; S.nodes[j].parent > 0; j = S.nodes[j].parent);
	for (k = i; k != j; k = t )
	{
		S.nodes[k].parent = j;
		t = S.nodes[k].parent;
	}
	return j;
}

  

猜你喜欢

转载自www.cnblogs.com/KIROsola/p/12064497.html