集合的表示之并查集5.3

以上图片在自网络

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

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

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

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

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

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

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

#include<stdio.h>
#define maxsize 100
typedef char Elem;
/**/
typedef struct N{
Elem e;
int parent;
}Node;

void init(Node s[]){

for(int i=0;i<maxsize;i++)
s[i].e=0,s[i].parent=-1;

}

int find(Node s[],Elem e){//找到某元素所在的集合,返回为数组的下标
	int i=0;
for(;i<maxsize&&s[i].e!=e;i++)
	;
if(i>maxsize)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");

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值