首页 > 其他分享 >并查集一

并查集一

时间:2023-03-09 23:11:19浏览次数:38  
标签:cnt 并查 puts int cin else 集一 find

  • 并查集一

    当我们需要快速判断两个元素是否归属于同一个集合
    或者将两个集合合并时,就会使用并查集

     

image-20230309230624218

#include<iostream>
using namespace std;
const int N = 1e5+10;
int p[N];
int n,m;
//寻找祖宗节点,+路径压缩
int find(int x){
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        p[i]=i;
    }
    while(m--){
        char t;
        int a,b;
        cin>>t;
        if(t=='M'){
            cin>>a>>b;
            p[find(a)]=find(b);
        }
        else{
            cin>>a>>b;
            if(find(a)==find(b)) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

image-20230309230730512

#include<iostream>
using namespace std;
const int N = 100020;
int p[N];
//cnt[find(a)] 维护a所在集合的祖宗节点代表整个连通分支的大小
int cnt[N];
int find(int x){
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        p[i]=i;
        cnt[i]=1;
    }
    while(m--){
        string t;
        int a,b;
        cin>>t;
        if(t=="C"){
            cin>>a>>b;
            //a可能已经和b在一个连通块中了
            if(find(a)!=find(b)){
                cnt[find(b)]+=cnt[find(a)];
                p[find(a)]=find(b);
            }else{
                continue;   
            }
        }
        else if(t=="Q1"){
            cin>>a>>b;
            if(find(a)==find(b)) puts("Yes");
            else puts("No");
        }
        else{
            cin>>a;
            cout<<cnt[find(a)]<<endl;
        }
    }
    return 0;
}

标签:cnt,并查,puts,int,cin,else,集一,find
From: https://www.cnblogs.com/zhouylove/p/17201870.html

相关文章

  • [蓝桥杯 2019 省 A] 修改数组 ———并查集练习(大学复健)
    本题拿到第一反应桶排序思想似乎可以水过,但是很明显出问题了。#include<bits/stdc++.h>usingnamespacestd;intN;inlineintkd(){ intx=0,f=1;charch=getchar......
  • 蓝桥杯 & 青蛙过河(最快贪心) (不用并查集)
      点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1000000+7;lla[N];llb[N];llc[N];lln,x;boolcheck(ll......
  • 并查集模板
    #include<bits/stdc++.h>usingnamespacestd;intfa[10005];intm,n;intfind(intx){ if(fa[x]!=x){ fa[x]=find(fa[x]); } returnfa[x];}booljudge(intx,......
  • 【并查集】LeetCode 990. 等式方程的可满足性
    题目链接990.等式方程的可满足性思路并查集模板题,模板可以参考常用算法模板。将字母视为结点,==表示有路径,!=表示无路径。遍历x==y,建立图前驱关系遍历x!=y,......
  • history 题解(并查集)
    考虑使用边带权并查集维护点之间的连通性,边权为这条边建立的时间,查询时如果查询时间小于边权则不能通行(巧妙地处理了时间的性质)。由于时间这种东西性质特殊无法路径压缩,所......
  • CF-25D - Roads not only in Berland(并查集或者搜索)
    D-RoadsnotonlyinBerlandCrawlinginprocess...CrawlingfailedTimeLimit:2000MSMemoryLimit:262144KB64bitIOFormat:%I64d&%I64u​​Submit​​......
  • 可持久化并查集
    本文因为做题做颓废了于是上B站学了下这玩意只因本概念支持回退,访问之前版本。建立在可持久化数组上。把fa数组可持久化并查集优化路径压缩按秩合并因为fa......
  • 并查集
    并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合......
  • 并查集
    并查集序言:我们大家都是好朋友并查集是一种维护关系的数据结构新手所学的并查集都是维护朋友关系的并查集朋友的朋友是朋友我们可以将变成朋友的点连到同一个集合中......
  • 浅谈一类多重传递关系的并查集问题
    首先解释一下什么叫“多种传递关系”:普通的并查集只能维护“朋友的朋友是朋友”,而面临“敌人的敌人是朋友”的情况十分乏力,多种传递关系即指“敌人的敌人是朋友”类情况。......