首页 > 其他分享 >并查集

并查集

时间:2024-03-23 15:45:26浏览次数:17  
标签:pre 化学物质 return int 查集 道路 find

并查集

畅通工程

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。

Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。

思路
对于N个城镇最多需要N-1条路,每次合并时道路数量减一

AC代码

#include <bits/stdc++.h>

using namespace std;

int pre[1005];

int find(int x){
    if (x==pre[x]) return pre[x];
    else return find(pre[x]);
}

void un(int a,int b){
    pre[find(a)]=find(b);
}

int main(){
    int n,m;
    while(true){
        cin >> n;
        if(n==0) return 0;
        cin >> m;
        for (int i=1;i<=n;i++){
            pre[i]=i;
        }
        int sum = n-1;
        int a,b;
        for(int i=0;i<m;i++){
            cin >> a >> b;
            if (find(a)==find(b)) continue;
            un(a,b);
            sum--;

        }
        cout << sum << "\n";
    }
    return 0;
}

DZY Loves Chemistry

DZY热爱化学,他喜欢混合化学物质。

DZY有n种化学物质,其中m对会发生反应。他想把这些化学物质倒入试管中,需要一个接一个地倒入,可以任意顺序。

让我们考虑试管的危险性。空试管的危险性为1。每次DZY倒入一种化学物质时,如果试管中已经有一种或多种可以与其发生反应的化学物质,试管的危险性将乘以2。否则,危险性保持不变。

找出在以最佳顺序一个接一个地倒入所有化学物质后的最大可能危险性。

输入
第一行包含两个用空格分隔的整数n和m。

接下来的m行中,每行包含两个用空格分隔的整数xi和yi(1 ≤ xi < yi ≤ n)。这些整数表示化学物质xi将与化学物质yi发生反应。每对化学物质最多只会在输入中出现一次。

考虑所有从1到n编号的化学物质,以某种顺序。

输出
输出一个整数 — 最大可能危险性。

思路

求最终的集合数量

AC代码


#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int pre[55];

int find(int x){
    if (pre[x]==x) return x;
    else return find(pre[x]);
}

void merge(int a,int b){
    pre[find(a)] = pre[find(b)];
}

int main(){
    int n,m;
    cin >> n >> m;
    //init;
    for (int i=1;i<=n;i++){
        pre[i]=i;
    }
    int a,b;
    for (int i=0;i<m;i++){
        cin >> a >> b;
        merge(a,b);
    }
    int cnt =0 ;
    for (int i=1;i<=n;i++){
        cnt +=(pre[i]==i);
    }
    ll ans;
    ans = pow(2,n-cnt);
    cout << ans << "\n";
    return 0;
}

标签:pre,化学物质,return,int,查集,道路,find
From: https://www.cnblogs.com/zineyu/p/18091186

相关文章

  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • 动态开点并查集+树上差分
    https://www.acwing.com/problem/content/description/2071/每次合并的时候需要开一个新点去实现信息的无后效性,也就是合并之前的两个连通块信息是无法共享的,发现这样开点连边最后形成一棵树,每次我们将信息传递到新点,也是两个合并点的lca,这使得最后求答案的直接求一边树上前缀和......
  • 数据结构(七)并查集---以题为例
    一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m 个操作,操作共有两种:Mab,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Qab,询问编号为 a 和 b 的两个数是否在同一个集合中;输入格式第一行输入整......
  • 并查集
    并查集并查集是一种可以动态维护若干个不重叠集合,并且支持合并与查询的数据结构,主要用于处理不相交集合的的合并关系。为了具体实现并查集这种数据结构,首先我们需要定义集合的表示方法。在并查集中,我们采用"代表元"法,即为每一个集合选择一个固定的元素,作为整个集合的代表。其......
  • 并查集
    模板题:https://www.luogu.com.cn/problem/P1551题解:#include<bits/stdc++.h>usingnamespacestd;intn,m,p;intfa[5050];intfind(intx){returnfa[x]==x?x:fa[x]=find(fa[x]);}intquery(intx,inty){intfx=find(x),fy=fi......
  • 并查集
    并查集是一种可以动态维护若干个不重叠的集合,并支持合并与查询的数据结构。例:P1551亲戚题目描述:如果\(x\)和\(y\)是亲戚,\(y\)和\(z\)是亲戚,那么\(x\)和\(z\)也是亲戚。如果\(x\)和\(y\)是亲戚,那么\(x\)的亲戚都是\(y\)的亲戚,\(y\)的亲戚也都是\(x\)的......
  • 并查集
    并查集目录并查集(1.概念:(2.详解Q1:如何表示不同的家族ans1:Q2:如何将两个人归到同一个家族中ans2:CODE:PS:(1.概念:处理不相交可合并的集合关系的数据结构叫做并查集;(2.详解例题:P1551亲戚一道并查集的板子题我们来详细解一下:Q1:如何表示不同的家族ans1:即如何表示不同的集合;再......
  • 并查集解mex_cf932_B. Informatics in MAC
    目录题目概述思路想法参考代码做题反思题目概述原题参考:B.InformaticsinMAC给出一个长度为n的数组,问是否可以将其分为k个(k>1)mex相同的数组,如果可以的话,作出一种划分思路想法假设一个数组可以被分为k(k>2)个区间,每个区间的mex相同,那么可以确定的是,该数组中一定不存在mex这......
  • 一类链式并查集问题
    链接:https://ac.nowcoder.com/acm/contest/69510/G来源:牛客网你在一个星球上,外星人amiloac想让你管理一条河流,该河流有\(x\)段,每两段之间有一个挡板隔开,每一段都有各自的颜色\(a\)。你需要管理\(q\)天,每一天你需要做以下的一种操作。\(1\l\r\)将第\(l\)至\(r\)段河流的所有未......
  • 带权并查集板子
    以一道区间和查询来说明板子如何使用1.merge的时候只需要维护两个根节点的距离,利用的是合并时题目给的信息2.find的时候更新维护是子节点到根的距离3.需要加一个查询函数,因为距离数组是开在结构体内部的。题目描述对于一个长度为\(N\)的整数数列\(A_{1},A_{2},\cdotsA_......