当前位置:网站首页>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
}
}
边栏推荐
- Golang etcdv3 reports an error. The attribute in grpc does not exist
- LeetCode 736. LISP syntax parsing
- Screen automatically generates database documents
- Common operating commands of Linux
- Implement custom memory allocator
- H3C VXLAN配置
- Synchronized underlying principle, volatile keyword analysis
- 模拟卷Leetcode【普通】1705. 吃苹果的最大数目
- Simulation volume leetcode [general] 1609 Parity tree
- Count the number of words C language
猜你喜欢
随机推荐
Full link voltage test of the e-commerce campaign Guide
ChaosBlade:混沌工程简介(一)
PMP Exam Preparation experience, seek common ground while reserving differences, and successfully pass the exam
Original collection of hardware bear (updated on June 2022)
Analysis of Hessian serialization principle
使用Typora编辑markdown上传CSDN时图片大小调整麻烦问题
徽商期货公司评级是多少?开户安全吗?我想开户,可以吗?
外部中断实现按键实验
Several common database connection methods
Unity Shader入门精要初级篇(一)-- 基础光照笔记
go mod module declares its path as: gtihub. com/xxx-xx but was required as:xx-xx
Digital triangle model acwing 1027 Grid access
Storage of data in memory
Three updates to build applications for different types of devices | 2022 i/o key review
C语言指针(下篇)
Serial port experiment - simple data sending and receiving
C语言指针(习题篇)
Two schemes of unit test
Troublesome problem of image resizing when using typora to edit markdown to upload CSDN
Postman interface test (I. installation and use)









