@@ -119,32 +119,271 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3800-3899/3820.Py
119119
120120<!-- solution:start -->
121121
122- ### 方法一
122+ ### 方法一:BFS + 枚举
123+
124+ 我们首先根据题目给定的边构建一个邻接表 $g$,其中 $g[ u] $ 存储与节点 $u$ 相邻的所有节点。
125+
126+ 接下来,我们定义一个函数 $\text{bfs}(i)$,用于计算从节点 $i$ 出发到其他所有节点的距离。我们使用一个队列来实现广度优先搜索(BFS),并维护一个距离数组 $\text{dist}$,其中 $\text{dist}[ j] $ 表示节点 $i$ 到节点 $j$ 的距离。初始时,$\text{dist}[ i] = 0$,其他节点的距离设为无穷大。在 BFS 过程中,我们不断更新距离数组,直到遍历完所有可达的节点。
127+
128+ 调用 $\text{bfs}(x)$、$\text{bfs}(y)$ 和 $\text{bfs}(z)$ 分别计算从节点 $x$、$y$ 和 $z$ 出发到其他所有节点的距离,得到三个距离数组 $d_1$、$d_2$ 和 $d_3$。
129+
130+ 最后,我们遍历所有节点 $u$,对于每个节点,取出其到 $x$、$y$ 和 $z$ 的距离 $a = d_1[ u] $、$b = d_2[ u] $ 和 $c = d_3[ u] $。我们将这三个距离排序,并检查是否满足勾股定理条件:$a^2 + b^2 = c^2$。如果满足条件,则将答案加一。
131+
132+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$,其中 $n$ 为树的节点数。
123133
124134<!-- tabs:start -->
125135
126136#### Python3
127137
128138``` python
129-
139+ class Solution :
140+ def specialNodes (
141+ self , n : int , edges : List[List[int ]], x : int , y : int , z : int
142+ ) -> int :
143+ g = [[] for _ in range (n)]
144+ for u, v in edges:
145+ g[u].append(v)
146+ g[v].append(u)
147+
148+ def bfs (i : int ) -> List[int ]:
149+ q = deque([i])
150+ dist = [inf] * n
151+ dist[i] = 0
152+ while q:
153+ for _ in range (len (q)):
154+ u = q.popleft()
155+ for v in g[u]:
156+ if dist[v] > dist[u] + 1 :
157+ dist[v] = dist[u] + 1
158+ q.append(v)
159+ return dist
160+
161+ d1 = bfs(x)
162+ d2 = bfs(y)
163+ d3 = bfs(z)
164+ ans = 0
165+ for a, b, c in zip (d1, d2, d3):
166+ s = a + b + c
167+ a, c = min (a, b, c), max (a, b, c)
168+ b = s - a - c
169+ if a * a + b * b == c * c:
170+ ans += 1
171+ return ans
130172```
131173
132174#### Java
133175
134176``` java
135-
177+ class Solution {
178+ private List<Integer > [] g;
179+ private int n;
180+ private final int inf = Integer . MAX_VALUE / 2 ;
181+
182+ public int specialNodes (int n , int [][] edges , int x , int y , int z ) {
183+ this . n = n;
184+ g = new ArrayList [n];
185+ Arrays . setAll(g, k - > new ArrayList<> ());
186+ for (int [] e : edges) {
187+ int u = e[0 ], v = e[1 ];
188+ g[u]. add(v);
189+ g[v]. add(u);
190+ }
191+
192+ int [] d1 = bfs(x);
193+ int [] d2 = bfs(y);
194+ int [] d3 = bfs(z);
195+
196+ int ans = 0 ;
197+ for (int i = 0 ; i < n; i++ ) {
198+ long [] a = new long [] {d1[i], d2[i], d3[i]};
199+ Arrays . sort(a);
200+ if (a[0 ] * a[0 ] + a[1 ] * a[1 ] == a[2 ] * a[2 ]) {
201+ ++ ans;
202+ }
203+ }
204+ return ans;
205+ }
206+
207+ private int [] bfs (int i ) {
208+ int [] dist = new int [n];
209+ Arrays . fill(dist, inf);
210+ Deque<Integer > q = new ArrayDeque<> ();
211+ dist[i] = 0 ;
212+ q. add(i);
213+ while (! q. isEmpty()) {
214+ for (int k = q. size(); k > 0 ; -- k) {
215+ int u = q. poll();
216+ for (int v : g[u]) {
217+ if (dist[v] > dist[u] + 1 ) {
218+ dist[v] = dist[u] + 1 ;
219+ q. add(v);
220+ }
221+ }
222+ }
223+ }
224+ return dist;
225+ }
226+ }
136227```
137228
138229#### C++
139230
140231``` cpp
141-
232+ class Solution {
233+ private:
234+ vector<vector<int >> g;
235+ int n;
236+ const int inf = INT_MAX / 2;
237+
238+ vector<int> bfs(int i) {
239+ vector<int> dist(n, inf);
240+ queue<int> q;
241+ dist[i] = 0;
242+ q.push(i);
243+ while (!q.empty()) {
244+ for (int k = q.size(); k > 0; --k) {
245+ int u = q.front();
246+ q.pop();
247+ for (int v : g[u]) {
248+ if (dist[v] > dist[u] + 1) {
249+ dist[v] = dist[u] + 1;
250+ q.push(v);
251+ }
252+ }
253+ }
254+ }
255+ return dist;
256+ }
257+
258+ public:
259+ int specialNodes (int n, vector<vector<int >>& edges, int x, int y, int z) {
260+ this->n = n;
261+ g.assign(n, {});
262+ for (auto& e : edges) {
263+ int u = e[ 0] , v = e[ 1] ;
264+ g[ u] .push_back(v);
265+ g[ v] .push_back(u);
266+ }
267+
268+ vector<int> d1 = bfs(x);
269+ vector<int> d2 = bfs(y);
270+ vector<int> d3 = bfs(z);
271+
272+ int ans = 0;
273+ for (int i = 0; i < n; ++i) {
274+ array<long long, 3> a = {
275+ (long long) d1[i],
276+ (long long) d2[i],
277+ (long long) d3[i]};
278+ sort(a.begin(), a.end());
279+ if (a[0] * a[0] + a[1] * a[1] == a[2] * a[2]) {
280+ ++ans;
281+ }
282+ }
283+ return ans;
284+ }
285+ };
142286```
143287
144288#### Go
145289
146290```go
291+ func specialNodes(n int, edges [][]int, x int, y int, z int) int {
292+ g := make([][]int, n)
293+ for _, e := range edges {
294+ u, v := e[0], e[1]
295+ g[u] = append(g[u], v)
296+ g[v] = append(g[v], u)
297+ }
298+
299+ const inf = int(1e9)
300+
301+ bfs := func(i int) []int {
302+ dist := make([]int, n)
303+ for k := 0; k < n; k++ {
304+ dist[k] = inf
305+ }
306+ q := make([]int, 0)
307+ dist[i] = 0
308+ q = append(q, i)
309+ for len(q) > 0 {
310+ sz := len(q)
311+ for ; sz > 0; sz-- {
312+ u := q[0]
313+ q = q[1:]
314+ for _, v := range g[u] {
315+ if dist[v] > dist[u]+1 {
316+ dist[v] = dist[u] + 1
317+ q = append(q, v)
318+ }
319+ }
320+ }
321+ }
322+ return dist
323+ }
324+
325+ d1 := bfs(x)
326+ d2 := bfs(y)
327+ d3 := bfs(z)
328+
329+ ans := 0
330+ for i := 0; i < n; i++ {
331+ a := []int{d1[i], d2[i], d3[i]}
332+ sort.Ints(a)
333+ x0, x1, x2 := int64(a[0]), int64(a[1]), int64(a[2])
334+ if x0*x0+x1*x1 == x2*x2 {
335+ ans++
336+ }
337+ }
338+ return ans
339+ }
340+ ```
147341
342+ #### TypeScript
343+
344+ ``` ts
345+ function specialNodes(n : number , edges : number [][], x : number , y : number , z : number ): number {
346+ const g: number [][] = Array .from ({ length: n }, () => []);
347+ for (const [u, v] of edges ) {
348+ g [u ].push (v );
349+ g [v ].push (u );
350+ }
351+
352+ const inf = 1e9 ;
353+
354+ const bfs = (i : number ): number [] => {
355+ const dist = Array (n ).fill (inf );
356+ let q: number [] = [i ];
357+ dist [i ] = 0 ;
358+ while (q .length ) {
359+ const nq = [];
360+ for (const u of q ) {
361+ for (const v of g [u ]) {
362+ if (dist [v ] > dist [u ] + 1 ) {
363+ dist [v ] = dist [u ] + 1 ;
364+ nq .push (v );
365+ }
366+ }
367+ }
368+ q = nq ;
369+ }
370+ return dist ;
371+ };
372+
373+ const d1 = bfs (x );
374+ const d2 = bfs (y );
375+ const d3 = bfs (z );
376+
377+ let ans = 0 ;
378+ for (let i = 0 ; i < n ; i ++ ) {
379+ const a = [d1 [i ], d2 [i ], d3 [i ]];
380+ a .sort ((p , q ) => p - q );
381+ if (a [0 ] * a [0 ] + a [1 ] * a [1 ] === a [2 ] * a [2 ]) {
382+ ans ++ ;
383+ }
384+ }
385+ return ans ;
386+ }
148387```
149388
150389<!-- tabs:end -->
0 commit comments