(」・ω・)」うー!(/・ω・)/にゃー!
——潜行吧奈亚子

并查集

并查集

概念

一种用来把一堆东西归并成几组的方法

实现方法

光看概念可能会懵掉,大概讲一下实现:

  • 首先,给定元素数量和关系数量,并初始化,把每个元素都创一个组,组名就是元素的值

  • 开始输入关系,每输入一个关系(\(a-b\)),就把关系中靠右的元素划分到靠左的元素中(就是把右边元素所在的组改成左边的元素所在的组

  • 不断地重复步骤\(2\),直到所有的关系已经输入完毕,再根据题意输出指定答案即可

解释个大概,上代码:

#include<iostream>
using namespace std;
int f[100001] = { 0 }, n, m;
//f数组存储“组长”,n表示n个人,m表示m个关系
void init() 
{
	int i;
	for (i = 1; i <= n; i++)
	{
		f[i] = i;//初始化组名为自己
	}
	return;
}
int getf(int v) 
{
	if (f[v] == v)
	{
		return v;
	}
	else 
	{
		f[v] = getf(f[v]);//找到“组长”
		return f[v];
	}
}
void mergeg(int v, int u) 
{
	int t1, t2;
	t1 = getf(v);
	t2 = getf(u);
	f[t2] = f[t1];//靠左原则,把“组长”改为靠左元素的“组长”
	return;
}
int main() 
{
	//code here
}
posted @ 2021-12-25 22:09  GalaxyOier  阅读(26)  评论(0)    收藏  举报