【笔记】力扣 2316. 统计无向图中无法互相到达点对数——并查集, + 一种巧妙的求两两相乘之和的方法

news/2025/4/1 9:46:07/文章来源:https://www.cnblogs.com/xiins/p/18800201

2316. 统计无向图中无法互相到达点对数

中等

提示

给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 aibi 之间有一条 无向 边。

请你返回 无法互相到达 的不同 点对数目

示例 1:

img

输入:n = 3, edges = [[0,1],[0,2],[1,2]]
输出:0
解释:所有点都能互相到达,意味着没有点对无法互相到达,所以我们返回 0 。

示例 2:

img

输入:n = 7, edges = [[0,2],[0,5],[2,4],[1,6],[5,4]]
输出:14
解释:总共有 14 个点对互相无法到达:
[[0,1],[0,3],[0,6],[1,2],[1,3],[1,4],[1,5],[2,3],[2,6],[3,4],[3,5],[3,6],[4,6],[5,6]]
所以我们返回 14 。

提示:

  • 1 <= n <= 105
  • 0 <= edges.length <= 2 * 105
  • edges[i].length == 2
  • 0 <= ai, bi < n
  • ai != bi
  • 不会有重复边。

题解

class Solution {
public:vector<int> parent;int find(int x) {if (x!=parent[x]) {parent[x]=find(parent[x]);}return parent[x];}void unionSet(int x, int y) {int rootX=find(x);int rootY=find(y);if (rootX!=rootY) {parent[rootX]=rootY;}}long long countPairs(int n, vector<vector<int>>& edges) {parent.resize(n);for (int i=0;i<n;i++) {parent[i]=i;}for (int i=0;i<edges.size();i++) { //易错,不是nunionSet(edges[i][0],edges[i][1]);}unordered_map<int,int> mem;for (int i=0;i<n;i++) {mem[find(i)]++;}long long cnt=0;long long remain=n;for (auto m:mem) {remain-=m.second;cnt+=m.second*remain;}return cnt;}
};

这里后面求和的地方非常巧妙
这是原本的求和思路,每块不连通节点区域,两两相乘

这是优化后的求和思路:

  1. 初始化 remainingNodes 为节点总数 n,代表初始未考虑的节点数。
  2. 遍历存储连通分量信息的 mem:
    获取当前连通分量节点数 componentSize。
    从 remainingNodes 中减去 componentSize,更新未考虑节点数。
    将 componentSize 与 remainingNodes 相乘,得到当前连通分量与剩余节点组成的不连通节点对数,累加到 cnt。
  3. 遍历结束,cnt 即为图中不连通节点对总数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APT Package Manager

from pixivWhat is APT? Anatomy of the Package System(软件包系统剖析), is the Debian packaging system, 用于管理软件包,可以将其想象成命令行版的App Store.Debian 是一个自由且开源的 Linux 发行版,Ubuntu 是基于 Debian 构建的 Linux 发行版。它由 Canonical 公司…

22.1-任务的状态 第22章-FreeRTOS项目实战--任务的创建与执行 FreeRTOS 项目 FreeRTOS学习笔记 FreeRTOS移植 FreeRTOS开源项目 FreeRTOS面试题汇

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里: https://www.bilibili.com/video/BV16x4y1M7EN/?share_source=copy_web&vd_source=f5d5850ab773377dff308188468fbc77 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式…

ART树在订单簿管理中的应用

背景近期在工作中,我接触到了一种高效的数据结构——自适应基数树(Adaptive Radix Tree,ART)。ART 是一种基于基数树(Radix Tree)的数据结构,旨在提供高效的键值存储和查找功能。与传统的基数树不同,ART 通过自适应调整节点大小(如 Node4、Node16、Node48 和 Node256)…

AtCoder Beginner Contest 399 ABCDEF 题目解析

A - Hamming Distance 题意 给定两个长度均为 \(N\) 的字符串 \(S\) 和 \(T\),求总共有多少个位置不同。 思路 直接输入字符串后逐位判断即可。 代码 int n; string s, t; cin >> n >> s >> t; int ans = 0; for(int i = 0; i < n; i++)ans += (s[i] != …

Solana编译失败探讨(OpenEuler RISC-V版)

Solana 是 2017 年由 Anatoly Yakovenko 创立的开源项目,旨在打造高性能、去中心化且低成本的区块链平台2。它采用独特的 Proof of History(PoH)共识机制,结合 Tower BFT 等技术,实现了每秒数千笔交易的高吞吐量,确认时间仅 400 毫秒,每笔交易中位数费用为 0.00064 SOL1…

windows将ollama及模型安装到D盘或其他盘符

Ollama官网 在ollama安装包存放的文件路径输入 cmd 回车自动打开命令窗口 在命令行输入一下内容: 软件包名称 /DIR=指定目录OllamaSetup.exe /DIR=E:\software\Ollama 弹出安装程序,直接Install ---------------------------------------------------------------------…

【DIY】通达信DIY添加扫雷宝、地图和复盘(1)

【写在前面】炒股软件有很多,电脑版我用的多的通达信,手机版用的多的是同花顺。之前还有一些其它的软件,比如A股通、短线王、wind股票、雪球等都有自己的特色。自己不喜欢一次装好多软件,所以就产生了聚合的念头。通达信通赢版可以登录多券商账号,懒得来回切换,所以选择以…

RabbitMQ进阶--TTL,死信队列,持久化,磁盘监控

一.消息的TTL机制 RabbitMQ中的TTL(Time-To-Live,存活时间)是指消息或队列的过期时间。TTL机制允许你指定消息在未被消费前可以存活的时间长度,超过这个时间后,消息将被视为“死亡”,并从队列中移除。这种机制对于控制消息的有效性和资源管理非常有用。 防止积压消息:当…

day41 基础的模块

基础模块 ad-hoc命令模式pingcommandshellcopyfilescriptcrongroupuser1.先看资料,看模块的语法 - 官网,看实例用法,语法注解 - ansible-doc -s 模块名 - 你自己的学习笔记2.每一个模块独有的参数语法,都是 ad-hoc命令模式ansible 主机组 -m 模块名 -a "模块独有的…

Java面试基础

一、Java基础语法 1.1 环境搭建与开发 1、JDK、JRE、JVM的关系和区别?(高频plus)JDK:Java Development Kit,Java开发工具包,包含了JRE和一系列Java开发工具。 JRE:Java Runtime Environment,Java程序的运行环境,包含JVM、Java核心类库等。JRE只能用来运行Java应用程序…

day41 Ansible剧本的语法

day41--ansible剧本的学习 1.剧本的主题的内容剧本就是两大部分的知识点 -ansible 模块(以及模块的参数) -yaml语法3.工作以后 维护公司的剧本 -看剧本,看懂了,维护,修改 -修改各种的参数,文件的路径,文件的名字,服务的端口名字(就是该ansible各种的参数,参数的值)2。…

Windows系统迁移用户目录

Windows系统随着使用时间的延长,系统盘空间占用会越来越大,对于一些硬盘空间有限的主机而言,C盘空间剩余就越来越少,稍不注意可以可能就被占满了,导致系统都无法启动。正好我自己的笔记本电脑也遇到了同样的问题,因此就想把C:\Users目录迁移到其他分区中。 在实践中,使用…