并查集
程序员文章站
2022-05-22 08:22:30
...
何谓并查集?
博主的理解就是,就像小时候打架一样。每个人最开始谁都不服谁,直到有一个人把你打服,那么你就会顺从他,当他的小弟。那么渐渐的,把你打服了的那位老大也可能被别人给收拾了。所以,你的老大不停的更换,你的帮派也在不停的扩大更新。但是,在某时,你肯定是不会为你的对立帮派做事情的。但是,现在有个人就问你,你什么时期是跟的哪位老大呀?你就得回答他
(抽象解释。。。)
请看题
那么,我们现在举例说明:
假如有3个人a,b,c。
最开始,他们只认自己做老大(谁都不服谁)。但是在某一天,b把a打服了,那么a就跟b混了(a,b为一个集合,这里我们就定义一个数组arr)则arr[a] = b(意思是,a的老大是b)。
这时,a又把c打服了,c臣服于a。则arr[c] = a(c的老大是a),但是,问题来了,现在的c不知道a的老大是b,所以,并查集的关键来了。
int arr[10050];
int Find(int k)//找最终的老大。
{
if(arr[k] == k)//如果一个人谁也不服谁(自己是自己的老大),那么就是arr[k] == k
return k;//找到最终的老大,返回
return arr[k] = Find(arr[k]);//如果他的上面还有老大,那么继续找,同时自己也要更新自己的老大(不然要被老大收拾)。
}
看懂了这里,并查集就差不多了。
终极代码
#include <bits/stdc++.h>
using namespace std;
int arr[10050];
int Find(int k)
{
if(arr[k] == k)
return k;
return arr[k] = Find(arr[k]);
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)//先初始化,自己是自己的老大
arr[i] = i;
while(m--)
{
int a,b,c;
cin >> a >> b >> c;
if(a == 1)
arr[Find(b)] = Find(c);//c打服了b
else
Find(b) == Find(c) ? cout << "Y" << endl : cout << "N" << endl;//如果b,c的老大是同一个人,那么他们互为自己人
}
}
实际上参考了一下大佬的解释方法~~嘻嘻嘻~
题目链接
上一篇: redis cluster集群搭建
下一篇: 搭建 redis-cluster集群