并查集求连通分量个数、优美的并查集板子

算法——图论:连通分量数量(深搜,光搜,并查集) 有n个城市,其中一些彼此相连,另一些没有相连。如果城市a与城市b直接相连,且城市b与城市c直接相连,那么城市a与城市c间接相连。是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个n x n的矩阵,其中表示第i个城市和第j个城市直接相连,而表示二者不直接相连。返回矩阵中的数量。(即求图的连通分量个数) 阅读详情

 

 

思路:

找祖先的数量,祖先的数量即为连通块的数量,并查集基本操作

 AC代码:
 

import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;

public class Main
{
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static int N = (int)2e5 + 10;
    static mqm bcj = new mqm();
    static Set<Integer> set = new HashSet<>();

    public static void main(String[] args ) throws IOException
    {
        int n = rd.nextInt();
        int m = rd.nextInt();

        bcj.init();
        for(int i = 1 ; i <= m ; i ++)
        {
            int u = rd.nextInt(),v =rd.nextInt();
            bcj.merge(u,v);
        }

        // 找祖先的数量,祖先的数量即为连通块的数量
        // 寻找每个点的祖先,丢到set里面去重,完美
        for(int i = 1 ; i <= n ; i ++)
        {
            set.add(bcj.find(i));
        }
        pw.println(set.size());
        pw.flush();
    }
}

class rd
{
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    static String nextLine() throws IOException { return reader.readLine(); }
    static String next() throws IOException
    {
        while(!tokenizer.hasMoreTokens())  tokenizer = new StringTokenizer(reader.readLine());
        return tokenizer.nextToken();
    }
    static int nextInt() throws IOException { return Integer.parseInt(next()); }
    static double nextDouble() throws IOException { return Double.parseDouble(next()); }
    static long nextLong() throws IOException { return Long.parseLong(next()); }
    static BigInteger nextBigInteger() throws IOException
    {
        BigInteger d = new BigInteger(rd.nextLine());
        return d;
    }
}

class math
{
    int gcd(int a,int b)
    {
        if(b == 0)  return a;
        else return gcd(b,a % b);
    }

    int lcm(int a,int b)
    {
        return a * b / gcd(a, b);
    }

    // 求n的所有约数
    List get_factor(int n)
    {
        List<Long> a = new ArrayList<>();
        for(long i = 1; i <= Math.sqrt(n) ; i ++)
        {
            if(n % i == 0)
            {
                a.add(i);
                if(i != n / i)  a.add(n / i);  // // 避免一下的情况:x = 16时,i = 4 ,x / i = 4的情况,这样会加入两种情况  ^-^复杂度能减少多少是多少
            }
        }

        // 相同因子去重,这个方法,完美
        a = a.stream().distinct().collect(Collectors.toList());

        // 对因子排序(升序)
        Collections.sort(a);

        return a;
    }

    // 判断是否是质数
    boolean check_isPrime(int n)
    {
        if(n < 2) return false;
        for(int i = 2 ; i <= n / i; i ++)  if (n % i == 0) return false;
        return true;
    }
}

class PII implements Comparable<PII>
{
    int x,y;
    public PII(int x ,int y)
    {
        this.x = x;
        this.y = y;
    }
    public int compareTo(PII a)
    {
        if(this.x-a.x != 0)
            return this.x-a.x;  //按x升序排序
        else return this.y-a.y;  //如果x相同,按y升序排序
    }
}

class Edge
{
    int a,b,c;
    public Edge(int a ,int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}

class Line implements Comparable<Line>
{
    double k; // 斜率
    double b; // 截距

    public Line(double k, double b)
    {
        this.k = k;
        this.b = b;
    }

    @Override
    public int compareTo(Line o)
    {
        if (this.k > o.k) return 1;
        if (this.k == o.k)
        {
            if (this.b > o.b) return 1;
            return -1;
        }
        return -1;
    }
}

class mqm
{
    int fa[] = new int[1005];
    void init()
    {
        for(int i = 1 ; i <= 1000 ; i ++)  fa[i] = i;
    }
    void merge(int x, int y) { fa[find(x)] = find(y); }
    int find(int x)
    {
        if(x != fa[x])  fa[x] = find(fa[x]);
        return fa[x];
    }
    boolean query(int x, int y) { return find(x) == find(y); }
}

 

 

 

使用并查集实现连通分量 在并查集的实现中,我们通常会针对每个节点维护一个parent数组,存储当前节点的父节点。而每个集合的代表元素(即根节点)可以通过不断查找parent数组,直到查找到自己的父节点是自己本身为止。当合并两个集合时,我们可以将其中一个集合的代表元素的parent指针指向另一个集合的代表元素即可。而在实际应用中,我们通常需要对图中的连通性进行判定和操作,比如网络路由、社交网络分析、谷歌搜索等等。在本篇文章中,我们将使用该并查集代码来实现连通分量。而通过使用并查集计算连通分量,我们可以正确地输出图中的连通子图个数。 阅读详情

相关推荐

TPAMI 2025新作LRFormer复现笔记:我的Windows 11 + RTX 4090配置全流程

本文详细记录了在Windows 11系统下使用RTX 4090显卡复现TPAMI 2025顶会论文LRTransformer的完整流程,包括硬件配置、系统优化、Python环境搭建及模型训练中的常见问题解决方案。特别针对Windows平台特有的路径管理、CUDA版本冲突和显存优化等关键技术细节提供了实用指南,帮助开发者高效完成环境搭建和模型训练。

weixin_29094301的博客 412

【c++入门(2)】并查集

并查集(Union Find Set):是一种用于处理分离集合的抽象数据类型。主要包含2种操作: 查询(Find):给定一个x,判断x属于哪个集合。 合并(Union):给定x和y,讲x所在的集合与y所在的集合合并。在顺序表实现中,使用数组记录每个元素所属的集合代表。A[i] = j,表示元素i所属集合的代表为j ① 初始化:make-set(x):设置A[x] = x,N个元素的时间复杂度O(N)。 ② 查找:find(x):返回A[x]的值,时间复杂度O(1)。 ③ 合并:union(y, x):如果x

1 1427

ui(new Ui::MainWindow)的解析

Ui命名空间的变量名,和默认空间的变量名虽然一样,但实际是两个不同的东西。所以构造函数中调用MainWindow是没问题的,因为它不是在调用自身,而是在调用其他命名空间下的另一个同名的MainWindow类。这里使用C++的成员初始化列表语法,初始化成员变量指针ui,可这里有个问题,在MainWindow的构造函数中new 一个MainWindow,这又调用一下MainWindow的构造函数,这岂不是会死循环?ui_mainwindow.h文件。mainwindow.h文件.

sinat_31608641的博客 1193

使用并查集实现查找无向图的连通分量和求解有向图的强连通分量

使用并查集实现查找无向图的连通分量

Keep_Trying_Go的博客 3186

NC数据预处理避坑指南:从MATLAB读取到GeoTIFF导出,解决坐标翻转与值域异常

本文详细解析了NC数据预处理中的常见问题,包括MATLAB读取时的坐标翻转与GeoTIFF导出时的值域异常。通过实战案例,介绍了如何解决矩阵方向错乱、处理FillValue与scale_factor、精准移植空间参考等关键问题,帮助研究者高效完成气象数据的批量处理与GIS兼容性验证。

weixin_30788619的博客 654

使用kmplot在线进行生存分析

欢迎关注”生信修炼手册”!kmplot是一个生存分析的在线工具,最初是设计用来对肝癌中的miRNA进行生存分析,对应的文章发表在scientific reports上,链接如下https...

庐州月光的博客 1万+

java---并查集算法---连通块中点的数量(每日一道算法2022.8.13)

Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等。给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等。Q2 a,询问点 a 所在连通块中点的数量...

SRestia的博客 371

Dify 第 10 篇 Dify 知识库手把手案例

本文介绍了如何利用Dify平台构建《阿里巴巴Java开发手册》智能助手。首先详细讲解了知识库创建的完整流程,包括文档上传、分段设置(推荐父子分段+段落上下文)、索引方式选择(高质量+混合检索)等关键步骤。随后指导用户进行分段质量检查和召回测试,强调TopK和Score参数的调优策略。接着演示了Chatflow应用开发过程,通过知识检索节点和LLM节点的配置,实现从知识库智能获取答案的功能。最后展示了应用发布和实际使用效果,成功实现了基于知识库的问答交互。案例采用DeepSeek-R1大模型,并支持答案引用显

甘蓝的专栏 1701

并查集求图的连通分量个数

前言 求图的连通分量个数在算法题中时有考到,是图算法中基础而重要的问题。对于这个问题,常用的解法有搜索算法(DFS、BFS等),及并查集算法。图的搜索算法在我的其他博文中已经介绍过,这里用一个例题介绍一下并查集求连通分量个数的方法。 对并查集算法不了解的同学可以看我的博文:并查集。 例题 题目链接:https://www.luogu.com.cn/problem/P1536 AC代码 #incl...

Simon的博客 6373

PHPStorm携手ThinkPHP8:开启高效开发之旅

本文围绕使用 PHPStorm 进行 ThinkPHP8 开发展开,先介绍开发环境搭建与 Xdebug 配置,再阐述 PHPStorm 集成 ThinkPHP8 的步骤,包括项目导入、解释器和服务器配置。还讲解了项目开发基础、数据库操作、高级技巧、调试处理及部署上线等内容,为开发者提供了从环境搭建到项目上线的完整指引,助力高效开展 ThinkPHP8 开发工作。

邓邓子的博客 1545

使用 Simulink 进行电力电子系统的大信号模型仿真

电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。大信号模型仿真的目的是通过模拟系统在非线性条件下的真实行为,评估其瞬态响应、稳态性能以及对不同负载和输入电压变化的响应。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的大信号模型仿真。背景介绍。

xiaoheshang_123的博客 303

【边最大匹配判定】2013changsha网络赛i题

涛哥讲过这种题有木有...还出了丘比特的烦恼有木有...结果我还是没过有木有T T 首先对于一个完备匹配的图来说,不存在非匹配的点,因此将匹配边指向Y集,非匹配边指向X集,那么,在同一个强联通分量中的边势必是可以互相替换的。 但这道题就坑在他不是一个完备匹配,有非匹配的点,那么只求强联通分量是不够的,我最后半个小时才发现这个问题,结果也没时间打补丁,而且我们想的打补丁的方法也很丑,bfs两遍看

huyuncong的专栏 981

QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)

一、环境介绍 QT版本: 5.12.6 编译环境: win10 64位 目标系统: Android 完整工程源码下载地址(包含APK文件):https://download.youkuaiyun.com/download/xiaolong1126626497/19051696 二、功能介绍 本软件是一款BLE蓝牙串口调试助手,支持常规的发送和接收调试,BLE是低功耗类型蓝牙,在智能家居、物联网领域使用较多。BLE低功耗蓝牙一般不能直接使用手机进行连接,手机蓝牙默认都是工作在传统蓝牙模式,无法直接连接BL..

7660

并查集—无向图中连通分量的数目(leetcode 323)

题目描述 给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。 示例 1: 输入: n = 5 和 edges = [[0, 1], [1, 2], [3, 4]] 0 3 | | 1 --- 2 4 输出: 2 示例 2: 输入: n = 5 和 edges = [[0, 1], [1, 2], [2, 3], [3, 4]] 0...

guoxinian的专栏 785

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

畅通工程

畅通工程 题面 题意找出最少要加几条路才可以让所有城市之间连通 分析 这是一道有关并查集的题目,就是确定连通分量的个数 以下是并查集的原理 以上图为例,h是b的父亲节点,c是b的根节点。如果两个节点之间有联系,那么其中一个点就是另一个点的父亲节点。以此类推,最高层即没有父亲节点的点成为根节点。 如何判断b与g之间是有联系(b与g的根节点如果有联系就代表这两个点有联系) b-&gt;h-&gt...

weixin_44412226的博客 259

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【LeetCode】﹝并查集ி﹞连通分量个数(套用模板一直爽)

【LeetCode】﹝并查集ி﹞连通分量个数(套用模板一直爽) 文章目录【LeetCode】﹝并查集ி﹞连通分量个数(套用模板一直爽)模板(使用路径压缩的加权quick-union算法)连通网络的操作次数★★省份数量★★岛屿数量★★由斜杠划分区域★★打砖块★★★保证图可完全遍历★★★ 模板(使用路径压缩的加权quick-union算法) 详细并查集的知识见往期博客 高级数据结构(Ⅰ)并查集(Union-Find) class UF{ int N; int count;

像写诗一样优雅地写代码~ 3万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

(并查集)求给定图G的连通分量的数目

本总结是是个人为防止遗忘而作,不得转载和商用。 题目          求给定图G的连通分量的数目。          如:某国家有N个小岛组成,经过多年的基础设施积累,若干岛屿之间建立了若干桥梁。先重新完善该国的行政区划,规定只要有桥梁连接的岛屿则归属同一个城市(可以通过其他岛屿中转),问该国一共多少个城市? 方法一:深度优先搜索          随便选一个点,搜完后如果有未访问的点

xueyingxue001的专栏 3765

数据结构实验:连通分量个数(并查集)

数据结构实验:连通分量个数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图, 否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含的顶点

Orz~~Orz 1828

连通分量个数(并查集的应用)

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判

jinzk123的博客 1万+

连通图 连通分量 并查集

一、连通图 1.顶点间的连通性 在无向图G中,若从顶点vi到顶点vj有路径(当然从vj到vi也一定有路径),则称vi和vj是连通的。 2.连通图 若V(G)中任意两个不同的顶点vi和vj都连通(即有路径),则称G为连通图(Con-nected Graph)。 【例】图G2,和G3是连通图。 ​3.连通分量 无向图G的极大连通子图称为G的最强连通分量(Connected Component)。 注意:   ① 任何连通图的连通分量只有一个,即是其自身  ② 非连...

软件工程小施同学 的专栏 2536

并查集求连通分量的个数

#include &lt;iostream&gt;#include &lt;stdio.h&gt;#include &lt;cstring&gt;using namespace std;const int maxn=100;int tree[maxn];int findroot(int x){    if(tree[x]==-1) return x;              //如果为-1,说明...

QAQ的小耗子的博客 1066

用并查集求解连通分量问题

<br />   在求解连通分量问题时,之前是用 搜索的思想,就是如果 用几次搜索能遍历整个图,那么连通分量就是n次-1,不过这种有一个问题就是空间消耗太大,我们必须为程序开一个a[n-1][n-1]的存储空间,当图中的结点个数太多时,我们将发现这种算法将是不可取的。。<br />       于是今天学习了一个新的数据结构就是并查集。。。他的思想是初始化时每个元素都是一个集合。。。之后把具有亲戚关系的元素合并,这样最后还能当得上所谓祖先的元素的元素个数就是有几个家族了,连通分量也就是家族个数减去1了。。这

shizhan1881的专栏 1993

并查集|无向图的连通分量

应用:连通子图,最小生成树,kruskal算法,最近公共祖先(LCA)1.初始化init,所有元素自己是自己的父节点2.查询find 递归查询 最终的祖先3.合并unionn 合并最终的父节点题目:给出一个无向图G,求其连通分量的数量。

Brittney27的博客 702

[杂记]算法: 并查集

我们考虑如何计算一个图连通分量的个数. 假定简单无向图G有两个连通分量(子图)G1​G2​, 如下图所示:一个很自然的想法是, 要想求连通分量个数, 我们可以使用Full-DFS算法, 也就是我们从某个点开始深度优先搜索, 并标记访问过的元素. 随后挨个顶点判断, 如果某个点没有被访问过, 则接着从该点进行深度优先搜索,除此之外, 我们还可以用并查集来求图中连通分量的个数. 并查集, 顾名思义, 有并与查两部分.

wjpwjpwjp0831的博客 744

图论——联通分量

求解连通分量数目 思路: 采用并查集的模板 具体为两个操作:查找、合并 代码: #include <iostream> using namespace std; const int MAXN = 101; int father[MAXN];//保存父亲结点的下标 int height[MAXN];//结点高度 void initial(int n)//初始化函数 { f...

weixin_43910851的博客 314

poj2524

题目大意:      问一个大学里学生的宗教,通过问一个学生可以知道另一个学生是不是跟他信仰同样的宗教。问学校里最多可能多少个宗教。也就是给定一个图的点数和相应的边,问有多少个连通分量。 解题思路:      用并查集,首先,使每个节点的根节点都指向自己,将根节点不相同的节点合并。要注意题目要求的输出格式。 c代码: #include #include #define max 500

u012558358的专栏 477
上一篇: 求连通块的数量(dfs、bfs)
下一篇: 求一棵树的最长路径
21RGHLY
博客等级 码龄5年 44粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

21RGHLY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值