当前位置:网站首页>LeetCode每日一题(2316. Count Unreachable Pairs of Nodes in an Undirected Graph)
LeetCode每日一题(2316. Count Unreachable Pairs of Nodes in an Undirected Graph)
2022-07-07 06:28:00 【wangjun861205】
You are given an integer n. There is an undirected graph with n nodes, numbered from 0 to n - 1. You are given a 2D integer array edges where edges[i] = [ai, bi] denotes that there exists an undirected edge connecting nodes ai and bi.
Return the number of pairs of different nodes that are unreachable from each other.
Example 1:
Input: n = 3, edges = [[0,1],[0,2],[1,2]]
Output: 0
Explanation: There are no pairs of nodes that are unreachable from each other. Therefore, we return 0.
Example 2:
Input: n = 7, edges = [[0,2],[0,5],[2,4],[1,6],[5,4]]
Output: 14
Explanation: There are 14 pairs of nodes that are unreachable from each other:
[[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]].
Therefore, we return 14.
Constraints:
- 1 <= n <= 105
- 0 <= edges.length <= 2 * 105
- edges[i].length == 2
- 0 <= ai, bi < n
- ai != bi
- There are no repeated edges.
用 union-find 的方法来把每一个孤立的图变成一棵树, 然后我们可以得到每棵树里面的节点数量, 假设 nodes[i]是当前树的节点数量, 那 n - nodes[i]就是所有与当前树里的节点不相连的节点数量, nodes[i] * (n - nodes[i])就是 pair 的数量, 遍历所有的数计算出 pair 数量进行加和就是最终答案
use std::collections::HashMap;
impl Solution {
fn find(parent: &mut Vec<i32>, n: i32) -> i32 {
let mut p = parent[n as usize];
if p == n {
return p;
}
p = Solution::find(parent, p);
parent[n as usize] = p;
p
}
fn union(parent: &mut Vec<i32>, a: i32, b: i32) {
let pa = Solution::find(parent, a);
let pb = Solution::find(parent, b);
parent[pa as usize] = pb;
}
pub fn count_pairs(n: i32, edges: Vec<Vec<i32>>) -> i64 {
let mut parent: Vec<i32> = (0..n).collect();
for e in edges {
Solution::union(&mut parent, e[0], e[1]);
}
while {
let mut modified = false;
for i in 0..n as usize {
let pp = parent[parent[i] as usize];
if parent[i] != pp {
Solution::union(&mut parent, i as i32, pp);
modified = true;
}
}
modified
} {
}
let m = parent.into_iter().fold(HashMap::new(), |mut m, v| {
*m.entry(v).or_insert(0) += 1;
m
});
let mut ans = 0;
for v in m.values() {
ans += *v * (n as i64 - *v);
}
ans / 2
}
}
边栏推荐
- Several methods of calculating the average value of two numbers
- 2020 year end summary
- C language pointer (Part 1)
- Goldbach conjecture C language
- Test Engineer Interview Questions 2022
- 【ChaosBlade:节点 CPU 负载、节点网络延迟、节点网络丢包、节点域名访问异常】
- C语言指针(中篇)
- Regularly modify the system time of the computer
- 串口实验——简单数据收发
- 数据在内存中的存储
猜你喜欢
Skill review of test engineer before interview
JVM garbage collection detailed learning notes (II)
On December 8th, 2020, the memory of marketing MRC application suddenly increased, resulting in system oom
What are the conditions for applying for NPDP?
2022-06-30 unity core 8 - model import
Summary of PMP learning materials
PMP Exam details after the release of the new exam outline
The longest ascending subsequence model acwing 1017 Strange thief Kidd's glider
面板显示技术:LCD与OLED
Esp32-ulp coprocessor low power mode RTC GPIO interrupt wake up
随机推荐
NVIC中断优先级管理
个人力扣题目分类记录
Postman interface debugging method
What is the use of PMP certificate?
Why is access to the external network prohibited for internal services of the company?
Register address name mapping
Postman interface test (I. installation and use)
Postman interface test (II. Set global variables \ sets)
Storage of data in memory
Selenium automation integration, eight years of testing experience, soft test engineer, an article to teach you
Isomorphic C language
Locust performance test 2 (interface request)
Systick tick timer
Common short chain design methods
C language pointer (exercises)
JVM 垃圾回收 详细学习笔记(二)
Do you have any certificates with high gold content?
模拟卷Leetcode【普通】1567. 乘积为正数的最长子数组长度
[chaosblade: delete pod according to the tag, pod domain name access exception scenario, pod file system i/o failure scenario]
Recommended by Alibaba P8, the test coverage tool - Jacobo is very practical