有这样一道宠物社交的算法题:如果我家的猫喜欢你家的狗,那么他们就可以成为好朋友,假设有n只宠物和m对朋友关系,那么这些宠物之间能够形成多少个朋友圈?(eg:现在有5只宠物,有小猫1,小猫2,小猫3,小狗1,小狗2,小猫1和小狗1是好朋友,小猫2和小狗1是好朋友,小猫3和小狗2是好朋友。那么它们就形成了两个朋友圈。)
我们先来看看什么是并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。
其实我们可以很容易的发现这个形成朋友圈的问题和并查集很相似,他们都是将同一组的放在一起,所以处理宠物的朋友圈问题就是先将每一个宠物先看做一棵树,如果宠物1和宠物2是朋友,那么就将宠物1和宠物2这两棵树合并,这样通过计算树的个数就可以将朋友圈的个数计算出来。这里我们可以将宠物存放在一个数组中,初始化为-1,数组中的元素表示树根。
例如:为了方便起见我们将宠物分别设为0,1,2,3,4,下面分别以树的构建过程以及对应数组的变化来简述算法过程。
(1)首先,将它们分别看作一棵树,即:
(2)0和3是好朋友,首先检查0和3都是树根,那么使0指向3(更改0的树根为3)