求朋友圈的个数---并查集

该博客介绍了如何利用并查集数据结构解决计算朋友圈个数的问题。通过给出的示例,讲述了初始化并查集、合并朋友圈以及遍历数组计算朋友圈数量的方法。核心在于将同一朋友圈的人归并到同一领导人的下,最终统计负数元素个数(除去首位的-1)来得到朋友圈的总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:
1、已知,有n个人和m对好友关系(存于一个集合r中)
2、如果两个人是直接的或者间接的好友,(那么他们的朋友圈可以合并)

则以下为例:

int a[][2] = { { 1, 2 }, { 2, 3 }, { 4, 5 } };

1)有5个人开辟6个整型数组,并初始化为-1


2)合并同一个朋友圈的人

{1,2}的领导人是1,{2,3}的领导人是2,要将同一个朋友圈的人都合并到领导人下


3.遍历数组,则遍历到的负数的个数就是朋友圈的个数,但要除去0号位置的-1。

代码如下;

#include<vector>

class UnionSet
{
public:
	UnionSet(size_t N)
	{
		//有5个人开辟6个整型数组,并初始化为-1
		_sets.resize(N+1,-1);
	}
	int FindRoot(int x)
	{
		while (_sets[x] >= 0)//找到对应朋友
		{
			x -= _sets[x];
		}
		return x;
	}
	//合并同一个朋友圈的人
	void UnionFriends(int x1,int x2)	
	{
		int root1 = FindRoot(x1);
		int root2 = FindRoot(x2);
		if (root1 != root2)
		{
			_sets[root1] += _sets[root2];
			_sets[root2] = root1;
		}
	}
	int Friends(int n, int m, int r[][2])
	{
		int counts = 0;
		for (int i = 0; i < m; i++)
		{
			UnionFriends(r[i][0],r[i][1]);
		}
		//计算朋友圈的个数
		for (int i = 1; i < n + 1; i++)//注意我是从1开始遍历,如果从0开始,就要减掉1
		{
			if (_sets[i] < 0)
				counts++;
		}
		return counts;
	}
protected:
	vector<int> _sets;
};
void test()
{
	int a[][2] = { { 1, 2 }, { 2, 3 }, { 4, 5 } };
	int n = 5, m = 3;
	UnionSet u(n);
	cout<<u.Friends(n,m,a)<<endl;
}
哈哈完了!!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值