APTX Blog

A Moe Blog Set Up By APTX

#洛谷#C/C++P3367并查集的使用及其实现

性质

并查集算法(union_find sets)支持分割一个集合,求连通子图、求最小生成树(克鲁斯卡尔)

输入输出格式

输入格式:

第一行包含两个整数N、M,表示共有N个元素和M个操作。

接下来M行,每行包含三个整数Zi、Xi、Yi

当Zi=1时,将Xi与Yi所在的集合合并

当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N

输出格式:

如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N

输入输出样例

输入样例#1:

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

输出样例#1:

N
Y
N
Y

模板代码

#include <iostream>
#include <cstdio>
using namespace std;

int fa[10005],n,m;
int find(int);

int main(){
	scanf ("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        fa[i]=i;
    for(int i=0;i<m;++i){
        int ask,x,y;
        scanf ("%d%d%d",&ask,&x,&y);
        if (ask==1) fa[find(x)]=find(y);
        else 
            if (find(x)==find(y))
                printf ("Y\n");
            else printf ("N\n");
    }
    return 0;
}
int find(int x){ //并查集核心
	if(x==fa[x]) return x;
	else return fa[x]=find(fa[x]);
}

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注