并查集,find函数的压缩路径,Union函数的小树合并大树

#include<stdio.h>

#define maxSize 10

//用森林的双亲表示法的思想,表示并查集

int SmaxSize;

//初始化,将每个元素的前驱下标设置为-1

void initial(int s\[\]){

for(int i=0;i<maxSize;i++){

si=-1;

}

}

//实现"查"的操作,查这个元素所属的根节点的下标

int find(int s\[\],int k){

int root=k;

while(sroot>=0) root=sroot;//找到根节点

//压缩路径,将k到根节点的所有结点都变为根节点的直接后继

while(k!=root){

int t=sk;//指向k的父节点

sk=root;

k=t;

}

return root;

}

//实现"并"的操作,小树并到大树里面

void Union(int s\[\],int root1,int root2){

if(root1==root2){

return;

}

//确保root1和root2是根节点

if(sroot1>=0){

root1=find(s,root1);

}

if(sroot2>=0){

root2=find(s,root2);

}

//小树合并到大树里面

if(sroot1>sroot2){

sroot2+=sroot1;//更新结点个数,每个根节点的数组值为连接的结点个数

sroot1=root2;//合并

}else{

sroot1+=sroot2;

sroot2=root1;

}

}

int main(){

//自己的测试数据

S0=-1;S1=0;S2=-1;S3=-1;S4=1;S5=1;S6=2;S7=3;S8=3;S9=3;S10=4;

printf("5的根节点是%d\n",find(S,5));

printf("6的根节点是%d\n",find(S,6));

//合并

Union(S,0,2);

printf("5的根节点是%d\n",find(S,5));

printf("6的根节点是%d\n",find(S,6));

return 0;

}

相关推荐
郝学胜-神的一滴1 小时前
游戏设计:原型与开发 19:U3D工位布置与性格说明书
人工智能·算法·unity·unreal engine·游戏策划·游戏设计
東隅已逝,桑榆非晚1 小时前
红黑树:从概念到实现
数据结构·c++·笔记·学习
hahaha60162 小时前
数字图像时域滤波或者3D降噪算法FPGA实现
算法·计算机视觉·fpga开发
YSL0701242 小时前
一文通关-----树和二叉树
数据结构·算法
小糯米6012 小时前
数据结构 数组与链表 内存与缓存
数据结构
青少儿编程课堂2 小时前
蓝桥杯青少组图形化+信息素养+电子学会Scratch考级:校园口算闯关解析
c++·python·算法·bfs·信息学竞赛
computersciencer2 小时前
应用贝叶斯公式:迟到了,那坐的是哪种交通工具呢?
算法·机器学习·概率论
若亦_2 小时前
排序>>交换排序
java·数据结构·算法
努力努力再努力wz3 小时前
【Lua 入门系列】Lua数据结构:从 Table 出发,一文串联数组、链表、栈、队列、集合、映射与树的实现原理
数据结构·链表·lua
dialect_11 小时前
KMP算法
开发语言·c++·算法