规定:
- 互反性:A和B是好朋友,等价于B和A是好朋友;
- 传递性:A和B是好朋友,B和C是好朋友,则A和C也是好朋友;
- 每组中任意两个都得是好朋友,每两组中不存在好朋友。
这题明显就是求并查集问题,如果是好朋友,那么他们的根节点相同,因此可以对每次输入的数字进行合并判断,若根节点不同则不在一组,如果根节点相同就在一组,因此根节点的数量就是输出的组数。
题:有一个叫做“数码世界”奇异空间,在数码世界里生活着许许多多的数码宝贝,其中有些数码宝贝之间可能是好朋友,并且数码宝贝世界有两条不成文的规定:第一,数码宝贝A和数码宝贝B是好朋友等价于数码宝贝B与数码宝贝A是好朋友;第二,如果数码宝贝A和数码宝贝C是好朋友,而数码宝贝B和数码宝贝C也是好朋友,那么A和B也是好朋友。
现在给出这些数码宝贝中所有好朋友的信息问:可以把这些数码宝贝分成多少组,满足每组中的任意两个数码宝贝都是好朋友,而且任意两组之间的数码宝贝都不是好朋友
输入:
7 5
1 2
2 3
3 1
1 4
5 6
代码如下:
#include<stdio.h>
const int maxn = 110;
int father[maxn] = {
0}; //记录每一个元素的父亲结点
bool isRoot[maxn] = {
false}; //某个元素是不是根节点