Skip to content

Commit ca38f01

Browse files
committed
feat: add solutions to lc problem: No.2316
No.2316.Count Unreachable Pairs of Nodes in an Undirected Graph
1 parent e1e72e7 commit ca38f01

File tree

7 files changed

+242
-191
lines changed

7 files changed

+242
-191
lines changed

solution/2300-2399/2316.Count Unreachable Pairs of Nodes in an Undirected Graph/README.md

Lines changed: 86 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@
4949

5050
<!-- 这里可写通用的实现逻辑 -->
5151

52+
**方法一:DFS**
53+
54+
对于无向图中的任意两个节点,如果它们之间存在一条路径,那么它们之间就是互相可达的。
55+
56+
因此,我们可以通过深度优先搜索的方式,找出每一个连通分量中的节点个数 $t$,然后将当前连通分量中的节点个数 $t$ 与之前所有连通分量中的节点个数 $s$ 相乘,即可得到当前连通分量中的不可达点对数目 $s \times t$,然后将 $t$ 加到 $s$ 中。继续搜索下一个连通分量,直到搜索完所有连通分量,即可得到答案。
57+
58+
时间复杂度 $O(n + m)$,空间复杂度 $O(n + m)$。其中 $n$ 和 $m$ 分别是节点数和边数。
59+
5260
<!-- tabs:start -->
5361

5462
### **Python3**
@@ -59,26 +67,24 @@
5967
class Solution:
6068
def countPairs(self, n: int, edges: List[List[int]]) -> int:
6169
def dfs(i):
62-
vis[i] = True
63-
res = 1
70+
vis.add(i)
71+
cnt = 1
6472
for j in g[i]:
65-
if not vis[j]:
66-
res += dfs(j)
67-
return res
73+
if j not in vis:
74+
cnt += dfs(j)
75+
return cnt
6876

6977
g = defaultdict(list)
7078
for a, b in edges:
7179
g[a].append(b)
7280
g[b].append(a)
73-
vis = [False] * n
74-
arr = []
81+
vis = set()
82+
ans = s = 0
7583
for i in range(n):
76-
if not vis[i]:
77-
arr.append(dfs(i))
78-
ans = t = 0
79-
for v in arr:
80-
t += v
81-
ans += v * (n - t)
84+
if i not in vis:
85+
t = dfs(i)
86+
ans += s * t
87+
s += t
8288
return ans
8389
```
8490

@@ -95,35 +101,31 @@ class Solution {
95101
vis = new boolean[n];
96102
g = new List[n];
97103
Arrays.setAll(g, k -> new ArrayList<>());
98-
for (int[] e : edges) {
104+
for (var e : edges) {
99105
int a = e[0], b = e[1];
100106
g[a].add(b);
101107
g[b].add(a);
102108
}
103-
List<Integer> arr = new ArrayList<>();
109+
long ans = 0, s = 0;
104110
for (int i = 0; i < n; ++i) {
105111
if (!vis[i]) {
106-
arr.add(dfs(i));
112+
long t = dfs(i);
113+
ans += s * t;
114+
s += t;
107115
}
108116
}
109-
int t = 0;
110-
long ans = 0;
111-
for (int v : arr) {
112-
t += v;
113-
ans += (long) v * (n - t);
114-
}
115117
return ans;
116118
}
117119

118120
private int dfs(int i) {
119121
vis[i] = true;
120-
int res = 1;
122+
int cnt = 1;
121123
for (int j : g[i]) {
122124
if (!vis[j]) {
123-
res += dfs(j);
125+
cnt += dfs(j);
124126
}
125127
}
126-
return res;
128+
return cnt;
127129
}
128130
}
129131
```
@@ -133,82 +135,102 @@ class Solution {
133135
```cpp
134136
class Solution {
135137
public:
136-
vector<vector<int>> g;
137-
vector<bool> vis;
138-
139138
long long countPairs(int n, vector<vector<int>>& edges) {
140-
vis.resize(n);
141-
g.resize(n, vector<int>());
139+
vector<vector<int>> g(n);
142140
for (auto& e : edges) {
143141
int a = e[0], b = e[1];
144-
g[a].push_back(b);
145-
g[b].push_back(a);
142+
g[a].emplace_back(b);
143+
g[b].emplace_back(a);
146144
}
147-
vector<int> arr;
148-
for (int i = 0; i < n; ++i)
149-
if (!vis[i]) arr.push_back(dfs(i));
150-
long long ans = 0;
151-
int t = 0;
152-
for (int& v : arr) {
153-
t += v;
154-
ans += 1ll * v * (n - t);
145+
vector<bool> vis(n);
146+
function<int(int)> dfs = [&](int i) -> int {
147+
vis[i] = true;
148+
int cnt = 1;
149+
for (int j : g[i]) {
150+
if (!vis[j]) {
151+
cnt += dfs(j);
152+
}
153+
}
154+
return cnt;
155+
};
156+
long long ans = 0, s = 0;
157+
for (int i = 0; i < n; ++i) {
158+
if (!vis[i]) {
159+
long long t = dfs(i);
160+
ans += s * t;
161+
s += t;
162+
}
155163
}
156164
return ans;
157165
}
158-
159-
int dfs(int i) {
160-
int res = 1;
161-
vis[i] = true;
162-
for (int j : g[i])
163-
if (!vis[j]) res += dfs(j);
164-
return res;
165-
}
166166
};
167167
```
168168
169169
### **Go**
170170
171171
```go
172-
func countPairs(n int, edges [][]int) int64 {
173-
vis := make([]bool, n)
172+
func countPairs(n int, edges [][]int) (ans int64) {
174173
g := make([][]int, n)
175174
for _, e := range edges {
176175
a, b := e[0], e[1]
177176
g[a] = append(g[a], b)
178177
g[b] = append(g[b], a)
179178
}
180-
var arr []int
179+
vis := make([]bool, n)
181180
var dfs func(int) int
182181
dfs = func(i int) int {
183-
res := 1
184182
vis[i] = true
183+
cnt := 1
185184
for _, j := range g[i] {
186185
if !vis[j] {
187-
res += dfs(j)
186+
cnt += dfs(j)
188187
}
189188
}
190-
return res
189+
return cnt
191190
}
192-
191+
var s int64
193192
for i := 0; i < n; i++ {
194193
if !vis[i] {
195-
arr = append(arr, dfs(i))
194+
t := int64(dfs(i))
195+
ans += s * t
196+
s += t
196197
}
197198
}
198-
ans := 0
199-
t := 0
200-
for _, v := range arr {
201-
t += v
202-
ans += v * (n - t)
203-
}
204-
return int64(ans)
199+
return
205200
}
206201
```
207202

208203
### **TypeScript**
209204

210205
```ts
211-
206+
function countPairs(n: number, edges: number[][]): number {
207+
const g = Array.from({ length: n }, () => []);
208+
for (const [a, b] of edges) {
209+
g[a].push(b);
210+
g[b].push(a);
211+
}
212+
const vis = new Array(n).fill(false);
213+
const dfs = (i: number) => {
214+
vis[i] = true;
215+
let cnt = 1;
216+
for (const j of g[i]) {
217+
if (!vis[j]) {
218+
cnt += dfs(j);
219+
}
220+
}
221+
return cnt;
222+
};
223+
let ans = 0;
224+
let s = 0;
225+
for (let i = 0; i < n; ++i) {
226+
if (!vis[i]) {
227+
const t = dfs(i);
228+
ans += s * t;
229+
s += t;
230+
}
231+
}
232+
return ans;
233+
}
212234
```
213235

214236
### **...**

0 commit comments

Comments
 (0)