|
| 1 | +# https://leetcode.com/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/description/ |
| 2 | +# T: O(N + E) where N is the number of nodes and E is the number of edges |
| 3 | +# S: O(N + E) where N is the number of nodes and E is the number of edges |
| 4 | + |
| 5 | +from collections import defaultdict |
| 6 | +class Solution: |
| 7 | + def __init__(self): |
| 8 | + self.graph = defaultdict(list) |
| 9 | + self.visited = set() |
| 10 | + self.n = 0 |
| 11 | + |
| 12 | + def add_edge(self, u, v): |
| 13 | + self.graph[u].append(v) |
| 14 | + self.graph[v].append(u) |
| 15 | + |
| 16 | + def dfs(self, v, component): |
| 17 | + self.visited.add(v) |
| 18 | + component.append(v) |
| 19 | + for neighbor in self.graph[v]: |
| 20 | + if neighbor not in self.visited: |
| 21 | + self.dfs(neighbor, component) |
| 22 | + |
| 23 | + def find_components(self): |
| 24 | + components = [] |
| 25 | + for v in range(self.n): |
| 26 | + if v not in self.visited: |
| 27 | + component = [] |
| 28 | + self.dfs(v, component) |
| 29 | + components.append(component) |
| 30 | + |
| 31 | + return components |
| 32 | + |
| 33 | + def countPairs(self, n, edges): |
| 34 | + for u, v in edges: |
| 35 | + self.add_edge(u, v) |
| 36 | + self.n = n |
| 37 | + component_lengths = [] |
| 38 | + components = self.find_components() |
| 39 | + for component in components: |
| 40 | + component_lengths.append(len(component)) |
| 41 | + print(components, component_lengths) |
| 42 | + |
| 43 | + k = sum(component_lengths) |
| 44 | + sol = 0 |
| 45 | + for l in component_lengths: |
| 46 | + sol+=((k-l)*l) |
| 47 | + sol = sol//2 |
| 48 | + |
| 49 | + return sol |
0 commit comments