集合的表示之并查集5.3

集合的表示之并查集5.3_第1张图片

以上图片在自网络

1、可用树结构表示集合,树的每个结点代表集合中一个元素。

2、用树根代表这个集合。

因此我们查某个元素属于哪个集合,实际就是查寻树中结点的根结点。

因为我们只需要知道树中某个结点的父亲结点,因此我们可以用双亲表示法来表示树,我们可以选择链表或数组作为存储结构!

//链表对应的一个元素结点类型
typedef int Ele;
struct Tnode{
Ele e;
struct Tnode *parent;
};

//数组对应的一个元素结点类型--静态链表
typedef int Ele;
struct Tnode{
Ele e;
int parent;
}

不管什么存储结构只要能表示数据元素之间的逻辑关系就可以,此处我们选择数组表示

#include
#define maxsize 100
typedef char Elem;
/**/
typedef struct N{
Elem e;
int parent;
}Node;

void init(Node s[]){

for(int i=0;imaxsize)return -1;
for(;s[i].parent>=0;i=s[i].parent)
;
return i;
}

void unionn(Node s[],Elem e1,Elem e2){//将两元素所在集合合并
int root1,root2;
root1=find(s,e1);
root2=find(s,e2);
if(root1!=root2)
	s[root1].parent=root2;//s[root2].parent=root1

}

int main(){
Node sss[maxsize];
init(sss);
sss[0].e='a';
sss[1].e='b';
sss[2].e='c';
sss[3].e='d';
unionn(sss,'a','b');
unionn(sss,'c','d');
unionn(sss,'d','b');
if(find(sss,'a')==find(sss,'d'))
printf("a and d connect");
else 
printf("a and d not connect");

}
集合的表示之并查集5.3_第2张图片

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