首页 > 其他分享 >NC235745 拆路 (并查集)

NC235745 拆路 (并查集)

时间:2023-06-26 17:14:45浏览次数:40  
标签:cnt fx fa int 查集 cin NC235745 find 拆路

https://ac.nowcoder.com/acm/problem/235745

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int fa[N],cnt[N],st[N],en[N],a[N],b[N],ans[N];
set<pair<int,int>>t;

int find(int i){
    if(fa[i] == i) return i;
    return fa[i] = find(fa[i]);
}

void merge(int x, int y){
    int fx = find(x), fy = find(y);
    if(cnt[fx] > cnt[fy]) fa[fy] = fx;
    else fa[fx] = fy;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        fa[i] = i;
        cin>>cnt[i];
    }
    for(int i=1;i<=m;i++) cin>>st[i]>>en[i];
    int q;
    cin>>q;
    for(int i=1;i<=q;i++){
        char op;
        cin>>op;
        if(op == 'Q'){
            cin>>a[i];
        }
        else{
            cin>>a[i]>>b[i];
            t.insert({a[i],b[i]});
            t.insert({b[i],a[i]});
        }
    }
    for(int i=1;i<=m;i++){
        if(t.find({st[i],en[i]})==t.end())
            merge(st[i],en[i]);
    }
    for(int i=q;i>=1;i--){
        if(b[i]) merge(a[i],b[i]);
        else ans[i] = cnt[find(a[i])];
    }
    for(int i=1;i<=q;i++)
        if(ans[i]) cout<<ans[i]<<'\n';
    return 0;
}

标签:cnt,fx,fa,int,查集,cin,NC235745,find,拆路
From: https://www.cnblogs.com/kingqiao/p/17501988.html

相关文章

  • 并查集
    publicclassUnionFind{//i的根节点时root[i]privateint[]root;publicUnionFind(intsize){root=newint[size];for(inti=0;i<size;i++){root[i]=i;}}publicvoidUnion(in......
  • 并查集的具体应用 CF1213G CF444E [HNOI2005]狡猾的商人
    每当我们看到“最大值最小”“路径上的最大最小值”等字眼时,我们就可以考虑并查集。我们可以尝试把这些问题转化为某种意义上按单调顺序的合并,利用并查集求解答案。以下时两例并查集的巧妙应用。CF1213GPathQueries注意“最大权值不大于q”,加上允许离线,我们可以把边按照权值......
  • abc049d <并查集>
    https://atcoder.jp/contests/abc049/tasks/arc065_b//https://atcoder.jp/contests/abc049/tasks/arc065_b//使用两个并查集维护连通关系//求并集,使用每个并查集的祖宗节点组成的pair表示这个交集#include<iostream>#include<algorithm>#include<map>usingnames......
  • 并查集
    并查集模板: #include<bits/stdc++.h>#defineMaxsize100005//只需要改这里就可以usingnamespacestd;intfa[Maxsize],rankk[Maxsize];inlinevoidinit(intn)//初始化{for(inti=1;i<=n;++i){fa[i]=i;rankk[i]=1;}}intfind(intx)/......
  • HDU 3277 Marriage Match III(并查集+二分+最大流)
    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢?一开始我想每个女孩连喜欢的男孩,而且选K个不喜欢的男孩也连边,可是这K个要怎么确定呢?这种显然......
  • HDU 3081 Marriage Match II(二分+并查集+最大流)
    题意:有N个女孩要与N个男孩玩配对游戏.每个女孩有一个可选男孩的集合(即该女孩可以选自己集合中的任意一个男孩作为该轮的搭档).然后从第一轮开始,每个女孩都要和一个不同的男孩配对.如果第一轮N个女孩都配对成功,那么就开始第二轮配对,女孩依然从自己的备选男孩集合中选择,但是不能......
  • HDU - 2473 (并查集+设立虚父节点(马甲))
    涉及到并查集的删除操作,比较复杂,可以利用虚设父节点的方法:例如:有n个节点,进行m次操作.首先将0~n-1的节点的父节点设置为i+n,n~2n+1的节点的父节点设置为本身,有m次操作,所以要用到m个虚节点,例如0,1,2,3,4,5的父节点为7,8,9,10,11,把他们插入2的集合,所以他们的根节点都为8,当把2从集合......
  • 数据结构与算法分析(Java语言描述)(24)—— 并查集的路径压缩
    packagecom.dataStructure.union_find;//我们的第五版Union-FindpublicclassUnionFind5{//rank[i]表示以i为根的集合所表示的树的层数//在后续的代码中,我们并不会维护rank的语意,也就是rank的值在路径压缩的过程中,有可能不在是树的层数值//这也是......
  • POJ2236(并查集)
    题目:http://poj.org/problem?id=2236 题意:给定n个点的坐标,然后选出其中的一些点出来,问在这些点中的指定的两点是否连通。#include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;constintN=1005;structPoint{intx,y;};Pointp[N];i......
  • UVALive - 6889[并查集+STL]
    题目链接:https://vjudge.net/contest/301219#problem/F 解题思路:枚举每个矩形的时候,看它是否需要和其他人合并只需要查看它的外形边框是否又被标记,这个可以直接用离散化,然后set存一下每个矩形四个格子,就可以用log(n)找到合并的矩形,然后后并查集并一下就好了。#include<bits/std......