LeetCode_并查集_DFS_中等_2316.统计无向图中无法互相到达点对数

news2024/11/18 11:46:01

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条无向边。请你返回无法互相到达的不同点对数目。

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

输入: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
不会有重复边。

2.思路

(1)并查集

(2)DFS

3.代码实现(Java)

//思路1————并查集
class Solution {
    public long countPairs(int n, int[][] edges) {
        UnionFind uf = new UnionFind(n);
        for (int[] edge : edges) {
            uf.union(edge[0], edge[1]);
        }
        long res = 0;
        for (int i = 0; i < n; i++) {
            res += n - uf.getSize(uf.find(i));
        }
        return res / 2;
    }
}

class UnionFind {
    // parent[x] 表示节点 x 的父节点
    int[] parent;
    // sizes[x] 表示根节点 x 所在的树的顶点总数
    int[] sizes;

    public UnionFind(int n) {
        parent = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
        sizes = new int[n];
        Arrays.fill(sizes, 1);
    }

    public int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }

    public void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            if (sizes[rootX] > sizes[rootY]) {
                parent[rootY] = rootX;
                sizes[rootX] += sizes[rootY];
            } else {
                parent[rootX] = rootY;
                sizes[rootY] += sizes[rootX];
            }
        }
    }

    public int getSize(int x) {
        return sizes[x];
    }
}
//思路2————DFS
class Solution {

    List<Integer>[] graph;
    boolean[] visited;

    public long countPairs(int n, int[][] edges) {
        graph = buildGraph(n, edges);
        visited = new boolean[n];
        long res = 0;
        for (int i = 0; i < n; i++) {
            if (!visited[i]) {
                long cnt = dfs(i);
                res += cnt * (n - cnt);
            }
        }
        return res / 2;
    }

    //通过 DFS 计算当前顶点 u 所在的连通分量的顶点数
    public long dfs(int u) {
        visited[u] = true;
        int cnt = 1;
        for (int v : graph[u]) {
            if (!visited[v]) {
                cnt += dfs(v);
            }
        }
        return cnt;
    }

    //构造邻接表
    public List<Integer>[] buildGraph(int n, int[][] edges) {
        List<Integer>[] graph = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            graph[i] = new ArrayList<>();
        }
        for (int[] edge : edges) {
            int u = edge[0];
            int v = edge[1];
            graph[u].add(v);
            graph[v].add(u);
        }
        return graph;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何解决电脑出现msvcp140.dll丢失问题,msvcp140.dll丢失的最全解决方法

首先&#xff0c;我们需要了解什么是“msvcp140.dll”。这是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。当计算机运行某些程序时&#xff0c;这个文件会被调用&#xff0c;以支持程序的正常运行。因此&#xff0c;当这个文件丢失时&…

3dmax中导出模型到unity注意事项

从3dmax中导出 1. 注意单位&#xff0c;根据需要&#xff0c;选英寸还是选厘米 2. 不能导出有错误的骨骼&#xff0c;否则导入后模型网格里出现 Skinned Mesh Renderer &#xff0c;对网格变换移动有影响&#xff0c;正常情况下都应该是 Mesh Renderer 3. 导出一般不带光源和…

【LeetCode刷题】:仅仅反转字母(双指针+字符串)

给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置 所有英文字母&#xff08;小写或大写&#xff09;位置反转 返回反转后的 s 示例 1&#xff1a; 输入&#xff1a;s “ab-cd” 输出&#xff1a;“dc-ba” 示例 2&#xff1a; …

【sqlserver】配置管理器打不开

问题描述 无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问。请注意&#xff0c;您只能使用SQL Server 配置管理器来管理 SQL Server 2005 和更高版本的服务 器。无效类[0x80041010] 解决方式: 命令提示符-右键-以管理员身份运行&#xff0c;再把以下代码执行一遍&…

案例分析真题--架构师

案例分析真题--架构师 试题1 质量属性架构风格 软件架构设计 系统开发基础 数据库系统 其他嵌入式 试题1 质量属性架构风格

bug记录(feign)——如何给feign加上请求头相关的参数,让生产者获得请求头中参数

问题描述 在微服务的调用中&#xff0c;如果消费者通过feign调用生产者&#xff0c;然后生产者方法中需要用到请求头&#xff0c;从请求头中获得token&#xff0c;但是feign默认是不携带请求头的&#xff0c;因此即使消费者请求feign的时候请求头中携带了token&#xff0c;也没…

QGIS003:【03捕捉工具栏】-点、线、面图层的捕捉操作

引言&#xff1a;QGIS捕捉工具栏包括启用捕捉、捕捉图层、捕捉位置、捕捉容差、启用拓扑编辑、拓扑规则、交叉处使用捕捉、启用追踪、自动捕捉等选项&#xff0c;本文介绍各选项的基本操作。 实验数据&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1GTeBNQqQJlJPj6Yu…

堆排序;大顶堆、小顶堆

堆排序 基本介绍 堆排序基本思想 堆排序步骤图解 在第二个步骤中&#xff0c;将节点6和它的两个左右节点比较大小&#xff0c;发现右节点最大&#xff0c;所以将节点6和节点9进行交换&#xff0c;如图所示&#xff0c;数组相应位置的值也交换 总结 代码实现 """…

Ubuntu 17.10的超震撼声音权限

从GNOME GUADEC 2017开发者大会归来之后&#xff0c;Canonical的Didier Roche就开始了一个日更博客系列&#xff0c;主要讲述即将带来的Ubuntu 17.10&#xff08;Artful Aardvark&#xff09;发行版将如何从Unity到GNOME Shell的转变。有趣的是&#xff0c;Ubuntu Unity桌面环境…

c语言练习91:合并两个有序链表

合并两个有序链表 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码1&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct Li…

基于springboot实现学生综合成绩测评系统项目【项目源码】

基于springboot实现学生合成绩测评系统演示 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的springboot框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个学生综合测评系统。 SpringBoot框架 SpringBo…

操作系统【OS】多线程模型

多对一模型 一对一模型 多对多模型 定义 多个ULT映射到一个KLT 每个ULT映射到一个KLT n个ULT映射到m个KLT&#xff0c; n≥m 优点 线程管理在用户空间进行&#xff0c;效率高 一个线程被阻塞&#xff0c;运行调度另一个线程运行&#xff0c;并发能力强 克服了多对一模型…

redis - 实现周期性数据无上报检测

需求背景 以小时为周期不停地上报事件到事件平台,事件平台如果在连续2个周期 没有检测到上报的事件,就会发送告警给事件的相关责任人. 问题的难点在于如何检测连续周期内无数据? 如上图,2 点和 3 点,都没有上报数据,说明连续两个周期存在无数据上报. 解决方案 本文采用 re…

专访 Web3Go 新产品 Reiki:培育 AI 原生数字资产与创意新土壤

从 DeFi 到 NFTFi、SocialFi&#xff0c;web3 从业者在尝试 crypto 与区块链技术能为我们的生活、创作、娱乐和文化带来何种新体验&#xff0c;而生成式人工智能的突破性发展则为我们与链上世界的交互、社区内容创作等带来了新的体验&#xff0c;改变互动、交易和价值创造方式。…

C++入门——引用|内联函数|auto关键字|基于范围的for循环|指针空值

前言 C入门专栏是为了补充C的不足&#xff0c;并为后面学习类和对象打基础。在前面我们已经讲解了命名空间、输入输出、缺省参数、重载函数等&#xff0c;今天我们将完结C的入门。 下面开始我们的学习吧&#xff01; 一、引用 1、引用是什么呢&#xff1f;为什么C添加了引用&a…

数据结构---HashMap和HashSet

HashMap和HashSet都是存储在哈希桶之中&#xff0c;我们可以先了解一些哈希桶是什么。 像这样&#xff0c;一个数组数组的每个节点带着一个链表&#xff0c;数据就存放在链表结点当中。哈希桶插入/删除/查找节点的时间复杂度是O(1) map代表存入一个key值&#xff0c;一个val值…

原型与原型链

一、原型&#xff1a;prototype 1.什么是原型&#xff1f; javascript常被描述为一种基于原型的语言&#xff08;每个对象都拥有一个原型对象&#xff09; 当访问一个对象的属性时&#xff0c;它不仅在该对象上寻找&#xff0c;还会寻找该对象的原型&#xff0c;以及该对象原…

【Java】人工智能交互智慧导诊系统源码

随着人工智能技术的快速发展&#xff0c;语音识别与自然语言理解技术的成熟应用&#xff0c;基于人工智能的智慧导诊导医逐渐出现在患者的生活视角中&#xff0c;智能导诊系统应用到医院就医场景中&#xff0c;为患者提供导诊、信息查询等服务&#xff0c;符合智慧医院建设的需…

Java利用反射和读取xml实现迷你容器

由于需要框架能实现多态&#xff0c;达到控制反转解耦。所以容器还是需要的&#xff0c;容器的存在可以简化对象获取工作&#xff0c;但是容器也不是万能的。合理使用即可&#xff0c;Spring对我来说太庞大了&#xff0c;用不着&#xff0c;为此给框架写一个迷你版容器。 容器…

Netty的高性能基石ByteBuf

前言 ​ NIO中缓冲区是数据传输的基础&#xff0c;JDK通过ByteBuffer实现&#xff0c;Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf。 ​ Netty中的ByteBuf对ByteBuffer做了大量的优化&#xff0c;比如说内存池&#xff0c;零拷贝&#xff0c;引用计数&#xf…