算法6-8~6-11:用树表示的等价问题 (c语言)

这篇博客探讨了如何利用树结构解决离散数学中的等价问题,特别是通过双亲表示法存储集合,并详细介绍了查找、归并等操作的算法。通过优化归并操作和引入“压缩路径”功能,可以提高算法效率。最后,给出了一个输入输出样例,展示如何判断经过多次集合合并后,两个元素是否属于同一集合。
摘要由CSDN通过智能技术生成

题目描述

在离散数学中,对等价关系和等价类的定义是:

如果集合S中的关系R是自反的、对称的和传递的,则称它为一个等价关系。

等价关系是现实世界中广泛存在的一种关系,许多应用问题可以归结至等价类问题,这类问题通常被称为等价问题。

通过使用集合,能够解决等价问题。而集合可以通过双亲表示法的树结构进行保存。通过对树结构的操作,可以实现查找、归并等操作。查找操作和归并操作的算法如下:

在以上的归并操作中,由于表示集合的树的深度与树形成的过程有关,因此在最坏情况下全部归并操作将会有O(n2)的复杂度。而通过在归并时比较子集所含成员的数目,令成员少的归并至成员多的集合,将能够提高算法的效率。下面给出优化的归并操作算法:

另外,通过增加“压缩路径”的功能,即将所有从根到相应元素路径上的元素都变成树根的孩子。算法如下所示:

本题中,将会给出n个原本互不相交的集合及k次集合合并的操作。通过这k次合并,判断最终的某两个原始的集合是否被合并成了同一个集合。

输入描述

输入的第一行包含两个用空格隔开的正整数n和k,其中n不超过100,k不超过n-1。

之后的k行中,每行包含两个用空格隔开的正整数x和y,表示将x元素所在的集合和y元素所在的集合合并至同一个集合。保证x和y均在1至n之间。

最后一行中,包含两个正整数,表示需要判断是否在同一个集合的元素编号。

输出描述

共一行,包含字符串“YES”或“NO”,“YES”表示需判断的元素在同一个集合中,“NO”表示不在同一个集合中。请注意不需要输出引号,且行尾输出换行。

输入样例
5 2
1 3
2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值