PAT- 并查集-好朋友

35 篇文章 0 订阅
29 篇文章 0 订阅

并查集的重点是维护一个father数组,来表明各结点间的关系

【好朋友】

1. 问题描述:

有一个叫做“数码世界”奇异空间,在数码世界里生活着许许多多的数码宝贝,其中有些数码宝贝之间可能是好朋友,并且数码宝贝世界有两条不成文的规定:

第一,数码宝贝A和数码宝贝B是好朋友等价于数码宝贝B与数码宝贝A是好朋友

第二,如果数码宝贝A和数码宝贝C是好朋友,而数码宝贝B和数码宝贝C也是好朋友,那么A和B也是好朋友,现在给出这些数码宝贝中所有好朋友的信息,问:可以把这些数码宝贝分成多少组,满足每组中的任意两个数码宝贝都是好朋友,而且任意两组之间的数码宝贝都不是好朋友。

思路:

A->B 和 B->A 等价,不需要考虑方向。A->B B->C,传递性,直接构成树即可

首先设定father数组为0,表示没有任何朋友;-1代表是根结点,其他值,表示父节点的位置。

  1. 输入两个值之后,若两个值没有出现过的话进行处理 -> 第一个值为根,第二个值指向第一个值。若出现过(father[i]!=0,则不做处理,因为不具有方向性,且可以传递)。
  2. 遍历father数组,选择0或-1的值,进行即可。
#include<cstdio>

const int maxn = 110;
int father[maxn] = { 0 };

int main() {
	/*
	7 5
	1 2
	2 3
	3 1
	1 4
	5 6
	*/
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 0; i < m; i++) {
		int tmp1, tmp2;
		scanf("%d%d", &tmp1, &tmp2);
		if (father[tmp1] == 0)
			father[tmp1] = -1;
		if (father[tmp2] == 0)
			father[tmp2] = tmp1;
	}
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		if (father[i] == -1 || father[i] == 0)
			cnt++;
	}
	printf("%d\n", cnt);

	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值