并查集(模版)

题目描述

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

输入输出格式

输入格式:

第一行包含两个整数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<bits/stdc++.h>
using namespace std;
int root[20009];
int n,m;
int x,z,y;
int f(int fa){
    if(root[fa]==fa)return fa;
    return root[fa]=f(root[fa]);
}//核心代码
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)root[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&z,&x,&y);
        int tx=f(x);
        int ty=f(y);//确定根节点
        if(z==1){
            root[ty]=root[tx];//合并根节点
        }
        if(z==2){
            if(tx==ty)cout<<"Y"<<endl;
            else cout<<"N"<<endl;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/1129-tangqiyuan/p/9747170.html

时间: 2024-10-10 07:46:24

并查集(模版)的相关文章

畅通工程(并查集模版题)

题意: 多组输入N,M,当N为0退出人输入,N是道路数目,M是村庄总数,随后N行,每行输入三个数两个村庄的编号,以及连接这两个村庄的费用.对每一组数据输出畅通工程的最低费用,如果不能畅通就输出“?”(不包括双引号) 这道题有两道链接: 一道是fjut的链接,另外一道是hdu的 http://www.fjutacm.com/Problem.jsp?pid=1214 http://acm.hdu.edu.cn/showproblem.php?pid=1863 思路:其实这道题就是一道排序+并查集题,

【poj 1988】Cube Stacking(图论--带权并查集 模版题)

题意:有N个方块,M个操作{“C x”:查询方块x上的方块数:“M x y”:移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法:带权并查集.每堆方块作为一个集合,维护3个数组:fa[x]表示x方块所在堆的最顶部的方块:d[x]表示x方块所在堆的最底部的方块:f[x]表示x方块方块x上的方块数. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<

并查集模版

两人找上级直到找到根节点看看是否是同派 int pre[1000];//祖先数组 int find(int x)//查找根节点 { int r=x; while(pre[r]!=r)//返回根节点r r=pre[r]; int i=x,j; while(i!=r)//路径压缩 { j=pre[i];//在改变上级之前用临时变量j记录下他的值 pre[i]=r;//把上级改为根节点 i=j; } return r; } void join(int x,int y)//判断x,y是否连通.如果已经连

并查集--The Suspects

The Suspects Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others. In

并查集_模版

并查集 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受:即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1-3秒)内计算出试题需要的结果,只能用并查集来描述. 并查集是一种树型的数据结构,

并查集(个人模版)

并查集: 1 int find(int a) 2 { 3 int r=a; 4 while(f[r]!=r) 5 r=f[r]; 6 int i=a; 7 int j; 8 while(i!=r) 9 { 10 j=f[i]; 11 f[i]=r; 12 i=j; 13 } 14 return r; 15 } 16 int merge(int a,int b) 17 { 18 int A,B; 19 A=find(a); 20 B=find(b); 21 if(A!=B) 22 { 23 f[B

带权并查集(个人模版)

带权并查集: 1 #include<stdio.h> 2 #include<string.h> 3 using namespace std; 4 int f[1000010]; 5 int sum[1000010]; 6 int find(int x) 7 { 8 if(x!=f[x]) 9 { 10 int pre=f[x];//pre是x的一个父节点. 11 f[x]=find(f[x]);//递归找祖先. 12 sum[x]+=sum[pre]; 13 } 14 return

畅通工程-最小生成树+并查集

原题链接:https://vjudge.net/problem/23261/origin 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 N 行对应村庄间道路的成本,每行给

CodeForces 745C Hongcow Builds A Nation 并查集

题意: 给了你n个城市 m条边 k个政府 每个政府管辖的区域内不能和其他政府的区域有相连 即政府之间不存在路径 问你在维护这种关系的同时 最多再加多少条边 思路: 先找出来每个联通块 再找出来没有归属的孤立的点 把他们都放到最大的联通块里 然后每个联通块之间的点两两连边是n*(n-1)/2条边 最后算出来的ans-m就好了 (看别人的博客学了一个max_element 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a