并查集模板

来源:互联网 发布:java判断上午还是下午 编辑:程序博客网 时间:2024/06/17 00:19

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入输出格式

输入格式:

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

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

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

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

输出格式:

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

输入输出样例

输入样例#1:
4 72 1 21 1 22 1 21 3 42 1 41 2 32 1 4
输出样例#1:
NYNY

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据,N<=10,M<=20;

对于70%的数据,N<=100,M<=1000;

对于100%的数据,N<=10000,M<=200000。






#include<cstdio>const int maxn=10010;int n,m;struct  Set{    int count;    int parent;}set[maxn];void Init(){    for(int i=0;i<n;i++){        set[i].count=1;        set[i].parent=i;    }}int  Find(int x){    int y=x;    while(set[y].parent!=y)y=set[y].parent;    while(set[x].parent!=x){        int temp=set[x].parent;        set[x].parent=y;        x=temp;    }    return y;}void Union(int x,int y){    x=Find(x),y=Find(y);    if(x==y)return;    if(set[x].count>set[y].count){        set[y].parent=x;        set[x].count+=set[y].count;    }    else{        set[x].parent=y;        set[y].count+=set[x].count;    }}int main(){    scanf("%d%d",&n,&m);    Init();        for(int i=0;i<m;i++){        int Z,X,Y;        scanf("%d%d%d",&Z,&X,&Y);        X--,Y--;        if(Z==1)Union(X,Y);        if(Z==2)        if(Find(X)==Find(Y))printf("Y\n");        else printf("N\n");    }    return 0;}


原创粉丝点击