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**
5967class 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
134136class Solution {
135137public:
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