49
49
50
50
<!-- 这里可写通用的实现逻辑 -->
51
51
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
+
52
60
<!-- tabs:start -->
53
61
54
62
### ** Python3**
59
67
class Solution :
60
68
def countPairs (self , n : int , edges : List[List[int ]]) -> int :
61
69
def dfs (i ):
62
- vis[i] = True
63
- res = 1
70
+ vis.add(i)
71
+ cnt = 1
64
72
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
68
76
69
77
g = defaultdict(list )
70
78
for a, b in edges:
71
79
g[a].append(b)
72
80
g[b].append(a)
73
- vis = [ False ] * n
74
- arr = []
81
+ vis = set ()
82
+ ans = s = 0
75
83
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
82
88
return ans
83
89
```
84
90
@@ -95,35 +101,31 @@ class Solution {
95
101
vis = new boolean [n];
96
102
g = new List [n];
97
103
Arrays . setAll(g, k - > new ArrayList<> ());
98
- for (int [] e : edges) {
104
+ for (var e : edges) {
99
105
int a = e[0 ], b = e[1 ];
100
106
g[a]. add(b);
101
107
g[b]. add(a);
102
108
}
103
- List< Integer > arr = new ArrayList<> () ;
109
+ long ans = 0 , s = 0 ;
104
110
for (int i = 0 ; i < n; ++ i) {
105
111
if (! vis[i]) {
106
- arr. add(dfs(i));
112
+ long t = dfs(i);
113
+ ans += s * t;
114
+ s += t;
107
115
}
108
116
}
109
- int t = 0 ;
110
- long ans = 0 ;
111
- for (int v : arr) {
112
- t += v;
113
- ans += (long ) v * (n - t);
114
- }
115
117
return ans;
116
118
}
117
119
118
120
private int dfs (int i ) {
119
121
vis[i] = true ;
120
- int res = 1 ;
122
+ int cnt = 1 ;
121
123
for (int j : g[i]) {
122
124
if (! vis[j]) {
123
- res += dfs(j);
125
+ cnt += dfs(j);
124
126
}
125
127
}
126
- return res ;
128
+ return cnt ;
127
129
}
128
130
}
129
131
```
@@ -133,82 +135,102 @@ class Solution {
133
135
``` cpp
134
136
class Solution {
135
137
public:
136
- vector<vector<int >> g;
137
- vector<bool > vis;
138
-
139
138
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);
142
140
for (auto& e : edges) {
143
141
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);
146
144
}
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
+ }
155
163
}
156
164
return ans;
157
165
}
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
- }
166
166
};
167
167
```
168
168
169
169
### **Go**
170
170
171
171
```go
172
- func countPairs (n int , edges [][]int ) int64 {
173
- vis := make ([]bool , n)
172
+ func countPairs(n int, edges [][]int) (ans int64) {
174
173
g := make([][]int, n)
175
174
for _, e := range edges {
176
175
a, b := e[0], e[1]
177
176
g[a] = append(g[a], b)
178
177
g[b] = append(g[b], a)
179
178
}
180
- var arr [] int
179
+ vis := make([]bool, n)
181
180
var dfs func(int) int
182
181
dfs = func(i int) int {
183
- res := 1
184
182
vis[i] = true
183
+ cnt := 1
185
184
for _, j := range g[i] {
186
185
if !vis[j] {
187
- res += dfs (j)
186
+ cnt += dfs(j)
188
187
}
189
188
}
190
- return res
189
+ return cnt
191
190
}
192
-
191
+ var s int64
193
192
for i := 0; i < n; i++ {
194
193
if !vis[i] {
195
- arr = append (arr, dfs (i))
194
+ t := int64(dfs(i))
195
+ ans += s * t
196
+ s += t
196
197
}
197
198
}
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
205
200
}
206
201
```
207
202
208
203
### ** TypeScript**
209
204
210
205
``` 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
+ }
212
234
```
213
235
214
236
### ** ...**
0 commit comments