树与等价问题
Posted kirosola
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树与等价问题相关的知识,希望对你有一定的参考价值。
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; }
以上是关于树与等价问题的主要内容,如果未能解决你的问题,请参考以下文章