并查集
并查集
概念
一种用来把一堆东西归并成几组的方法
实现方法
光看概念可能会懵掉,大概讲一下实现:
-
首先,给定元素数量和关系数量,并初始化,把每个元素都创一个组,组名就是元素的值
-
开始输入关系,每输入一个关系(\(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
}