2316. Count Unreachable Pairs of Nodes in an Undirected Graph
Description
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.
Solution
count-unreachable-pairs-of-nodes-in-an-undirected-graph.py
class DSU:
def __init__(self, n):
self.graph = list(range(n))
def find(self, x):
if self.graph[x] != x:
self.graph[x] = self.find(self.graph[x])
return self.graph[x]
def union(self, x, y):
ux, uy = self.find(x), self.find(y)
self.graph[ux] = uy
def connected(self, x, y):
return self.find(x) == self.find(y)
def disconnect(self, x):
self.graph[x] = x
class Solution:
def countPairs(self, n: int, edges: List[List[int]]) -> int:
dsu = DSU(n)
for a, b in edges:
dsu.union(a, b)
parents = [0] * n
pp = [-1] * n
for node in range(n):
p = dsu.find(node)
pp[node] = p
parents[p] += 1
res = 0
for node in range(n):
res += n - parents[pp[node]]
return res // 2