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

算法——图论:连通分量数量(深搜,光搜,并查集) 有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指针指向另一个集合的代表元素即可。而在实际应用中,我们通常需要对图中的连通性进行判定和操作,比如网络路由、社交网络分析、谷歌搜索等等。在本篇文章中,我们将使用该并查集代码来实现连通分量。而通过使用并查集计算连通分量,我们可以正确地输出图中的连通子图个数。 阅读详情

相关推荐

Veeam Backup & ONE download

前言 Veeam® Availability Suite™ 是 Veeam 的旗舰解决方案,可实现简单、灵活和可靠的数据管理。消除与数据保护、恢复、监控、勒索软件防护和合规性相关的手动流程,从而减轻数据维护压力。Veeam 能够帮助您节省时间和成本,同时支持您减少在备份方面花费的时间,将更多精力放在推动业务发展上。 Veeam Availability Suite Release 版本 包含 发布时间 复制磁力链接使用迅雷或者bittorrent ...

极致,细节 1998

【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

VCL for PHP,Konopka Signature VCL Controls (Raize Components 6.2.3) for Delphi 10.4

The Raize Components suite includes a variety of interface design tools for Delphi programming language and C ++ Builder, which includes over 125 VCL controls and over 100 different tools for creating...

weixin_42137539的博客 853

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

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

Keep_Trying_Go的博客 3186

星座SAR动目标检测(GMTI)

参考代码 星座SAR动目标检测 www.youwenfan.com/contentcsg/52399.html。

feifeigo123的博客 549

CentOS 7 离线升级 OpenSSH 9.9p2 保姆级教程(含依赖包下载与常见报错解决)

本文提供了一份详尽的CentOS 7系统离线升级OpenSSH至9.9p2版本的完整教程。针对无外网环境,重点讲解了依赖包(尤其是OpenSSL 3.x)的离线下载与编译部署,并深入解决了编译过程中常见的“libcrypto.so缺失”等动态库链接错误。教程涵盖从环境准备、源码编译、服务配置到系统集成的全流程,最后还提供了关键的回滚方案与应急预案,是运维人员在内网环境中进行安全加固的实用指南。

weixin_29248313的博客 323

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

行人检测模型在海思平台上的部署:从 PyTorch 到 NNIE 深度优化与实践

摘要 本文详细介绍行人检测模型从PyTorch到海思NNIE平台的部署流程。首先分析了行人检测面临的挑战(尺度变化、遮挡、姿态多样性等)及边缘部署的优势(实时性、隐私保护等)。重点阐述了模型转换过程:PyTorch→ONNX→Caffe→NNIE-WK,其中PyTorch转ONNX需注意评估模式设置、虚拟输入匹配、操作集版本选择等关键点。文章旨在帮助开发者在海思3516D芯片上实现高效的行人检测,克服部署过程中的常见问题,最终实现边缘设备的实时目标检测能力。

FJN110的博客 216

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

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

Simon的博客 6373

Python爬虫实战:逆向工程与异步爬虫技术,高效抓取国家知识产权局专利数据

相比于传统的Selenium,Playwright由微软开发,支持多浏览器(Chromium, Firefox, WebKit),API更现代,执行速度更快,并且能轻松录制用户操作生成代码。通常,列表中的摘要信息是缩略的,我们需要进入每个专利的详情页获取完整信息(如主权要求、法律状态等)。我们的第一步是手动操作一遍搜索流程,并用Playwright的“录制”功能或开发者工具,找出真正返回专利数据的那一个或多个网络请求。以友好的、对人类行为模拟的方式爬取数据是基本的网络礼仪,也能有效避免你的IP被封锁。

2201_76125261的博客 2419

第9章:Embedding、Pooling 与检索增强基础

本文介绍了律师事务所如何利用vLLM构建法律文档RAG系统,解决传统关键词检索在语义匹配上的不足。主要内容包括: 项目背景:传统Elasticsearch检索在法律术语上的低准确率问题,及多模型维护的复杂性; 技术方案:采用vLLM统一支持生成和向量化能力,通过语义向量检索提升相关性; 关键实现: 用vLLM的Embedding端点处理文档向量化 构建包含离线索引和在线检索的完整RAG流程 采用余弦相似度进行语义匹配 实践建议:切片大小选择、向量归一化处理、不同场景下的数据库选型等。

davidwang456的专栏 59

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

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

huyuncong的专栏 981

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 379

并查集—无向图中连通分量的数目(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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

畅通工程

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

weixin_44412226的博客 259

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

(并查集)求给定图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、付费专栏及课程。

余额充值