洛谷 P3367 【模板】并查集
题目
见题目链接
题目链接【模板】并查集 - 洛谷
输入
见题目链接
输出
见题目链接
样例
见题目链接
题解
并查集模版题,参考朋友圈(并查集)
区别在于寻找根节点的函数中,路径压缩由for循环的形式变成了递归的形式,从效率上来讲可能会好一点点 可能是一个常数级别的优化吧,我猜的
代码
#include <stdio.h>
#define MAX 10005
int p[MAX];
void init(int n){
for (int i = 1; i <= n; i++){
p[i] = i;
}
}
int search(int x){
if (p[x] == x)
return x;
else
return p[x] = search(p[x]); //递归版本的路径压缩
}
void join(int root1, int root2){
int father1,father2;
father1 = search(root1); //这里很容易写错,写成fatehr1 = p[root1],这样会导致TLE或者MLE TLE还可以理解,MLE就很玄学233
father2 = search(root2);
if (father1 != father2){
p[father2] = father1;
}
}
int main(){
int n,m;
scanf("%d %d", &n, &m);
init(n);
for (int i = 0; i < m; i++){
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
if (x == 1){
join(y,z);
}
if (x == 2){
int father1, father2;
father1 = search(y);
father2 = search(z);
if (father1 == father2)
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}