62
62
63
63
** 方法一:BFS**
64
64
65
+ 我们先根据题目给出的无向树的边,建立一个邻接表 $g$,其中 $g[ u] $ 表示顶点 $u$ 的所有相邻顶点。
66
+
67
+ 然后,我们定义以下数据结构:
68
+
69
+ - 队列 $q$,用于存储每一轮搜索的顶点及其概率,初始时 $q = [ (1, 1.0)] $,表示青蛙在顶点 $1$ 的概率为 $1.0$;
70
+ - 数组 $vis$,用于记录每个顶点是否被访问过,初始时 $vis[ 1] = true$,其余元素均为 $false$。
71
+
72
+ 接下来,我们开始进行广度优先搜索。
73
+
74
+ 在每一轮搜索中,我们每次取出队首元素 $(u, p)$,其中 $u$ 和 $p$ 分别表示当前顶点及其概率。当前顶点 $u$ 的相邻顶点中未被访问过的顶点的个数记为 $cnt$。
75
+
76
+ - 如果 $u = target$,说明青蛙已经到达目标顶点,此时我们判断青蛙是否在 $t$ 秒到达目标顶点,或者不到 $t$ 秒到达目标顶点但是无法再跳跃到其它顶点(即 $t=0$ 或者 $cnt=0$)。如果是,则返回 $p$,否则返回 $0$。
77
+ - 如果 $u \neq target$,那么我们将概率 $p$ 均分给 $u$ 的所有未被访问过的相邻顶点,然后将这些顶点加入队列 $q$ 中,并且将这些顶点标记为已访问。
78
+
79
+ 在一轮搜索结束后,我们将 $t$ 减少 $1$,然后继续进行下一轮搜索,直到队列为空或者 $t \lt 0$。
80
+
81
+ 最后,若青蛙仍然没有到达目标顶点,那么我们返回 $0$。
82
+
83
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是无向树的顶点数。
84
+
65
85
<!-- tabs:start -->
66
86
67
87
### ** Python3**
@@ -83,12 +103,13 @@ class Solution:
83
103
while q and t >= 0 :
84
104
for _ in range (len (q)):
85
105
u, p = q.popleft()
86
- nxt = [v for v in g[u] if not vis[v]]
87
- if u == target and (not nxt or t == 0 ):
88
- return p
89
- for v in nxt:
90
- vis[v] = True
91
- q.append((v, p / len (nxt)))
106
+ cnt = sum (not vis[v] for v in g[u])
107
+ if u == target:
108
+ return p if cnt * t == 0 else 0
109
+ for v in g[u]:
110
+ if not vis[v]:
111
+ vis[v] = True
112
+ q.append((v, p / cnt))
92
113
t -= 1
93
114
return 0
94
115
```
@@ -102,7 +123,7 @@ class Solution {
102
123
public double frogPosition (int n , int [][] edges , int t , int target ) {
103
124
List<Integer > [] g = new List [n + 1 ];
104
125
Arrays . setAll(g, k - > new ArrayList<> ());
105
- for (int [] e : edges) {
126
+ for (var e : edges) {
106
127
int u = e[0 ], v = e[1 ];
107
128
g[u]. add(v);
108
129
g[v]. add(u);
@@ -111,26 +132,27 @@ class Solution {
111
132
q. offer(new Pair<> (1 , 1.0 ));
112
133
boolean [] vis = new boolean [n + 1 ];
113
134
vis[1 ] = true ;
114
- while ( ! q. isEmpty() && t >= 0 ) {
135
+ for (; ! q. isEmpty() && t >= 0 ; -- t ) {
115
136
for (int k = q. size(); k > 0 ; -- k) {
116
- Pair< Integer , Double > x = q. poll();
137
+ var x = q. poll();
117
138
int u = x. getKey();
118
139
double p = x. getValue();
119
- List< Integer > nxt = new ArrayList<> () ;
140
+ int cnt = 0 ;
120
141
for (int v : g[u]) {
121
142
if (! vis[v]) {
122
- nxt. add(v);
123
- vis[v] = true ;
143
+ ++ cnt;
124
144
}
125
145
}
126
- if (u == target && (nxt . isEmpty() || t == 0 ) ) {
127
- return p ;
146
+ if (u == target) {
147
+ return cnt * t == 0 ? p : 0 ;
128
148
}
129
- for (int v : nxt) {
130
- q. offer(new Pair<> (v, p / nxt. size()));
149
+ for (int v : g[u]) {
150
+ if (! vis[v]) {
151
+ vis[v] = true ;
152
+ q. offer(new Pair<> (v, p / cnt));
153
+ }
131
154
}
132
155
}
133
- -- t;
134
156
}
135
157
return 0 ;
136
158
}
@@ -149,28 +171,28 @@ public:
149
171
g[ u] .push_back(v);
150
172
g[ v] .push_back(u);
151
173
}
152
- typedef pair<int, double> pid;
153
- queue<pid > q;
154
- q.push({1, 1.0});
155
- vector<bool > vis(n + 1);
174
+ queue<pair<int, double>> q{{{1, 1.0}}};
175
+ bool vis[ n + 1] ;
176
+ memset(vis, false, sizeof(vis));
156
177
vis[ 1] = true;
157
- while (!q.empty () && t >= 0) {
178
+ for (; q.size () && t >= 0; --t ) {
158
179
for (int k = q.size(); k; --k) {
159
- auto x = q.front();
180
+ auto [ u, p ] = q.front();
160
181
q.pop();
161
- int u = x.first;
162
- double p = x.second;
163
- vector<int > nxt;
182
+ int cnt = 0;
183
+ for (int v : g[ u] ) {
184
+ cnt += !vis[ v] ;
185
+ }
186
+ if (u == target) {
187
+ return cnt * t == 0 ? p : 0;
188
+ }
164
189
for (int v : g[ u] ) {
165
190
if (!vis[ v] ) {
166
191
vis[ v] = true;
167
- nxt.push_back(v );
192
+ q.push({v, p / cnt} );
168
193
}
169
194
}
170
- if (u == target && (t == 0 || nxt.empty())) return p;
171
- for (int v : nxt) q.push({v, p / nxt.size()});
172
195
}
173
- --t;
174
196
}
175
197
return 0;
176
198
}
@@ -180,46 +202,84 @@ public:
180
202
### **Go**
181
203
182
204
```go
183
- type pid struct {
184
- x int
185
- p float64
186
- }
187
-
188
205
func frogPosition(n int, edges [][]int, t int, target int) float64 {
189
206
g := make([][]int, n+1)
190
207
for _, e := range edges {
191
208
u, v := e[0], e[1]
192
209
g[u] = append(g[u], v)
193
210
g[v] = append(g[v], u)
194
211
}
195
- q := []pid{pid{1, 1.0}}
212
+ type pair struct {
213
+ u int
214
+ p float64
215
+ }
216
+ q := []pair{{1, 1}}
196
217
vis := make([]bool, n+1)
197
218
vis[1] = true
198
- for len(q) > 0 && t >= 0 {
219
+ for ; len(q) > 0 && t >= 0; t-- {
199
220
for k := len(q); k > 0; k-- {
200
- x := q[0]
221
+ u, p := q[0].u, q[0].p
201
222
q = q[1:]
202
- u, p := x.x, x.p
203
- var nxt []int
223
+ cnt := 0
204
224
for _, v := range g[u] {
205
225
if !vis[v] {
206
- vis[v] = true
207
- nxt = append(nxt, v)
226
+ cnt++
208
227
}
209
228
}
210
- if u == target && (len(nxt) == 0 || t == 0) {
211
- return p
229
+ if u == target {
230
+ if cnt*t == 0 {
231
+ return p
232
+ }
233
+ return 0
212
234
}
213
- for _, v := range nxt {
214
- q = append(q, pid{v, p / float64(len(nxt))})
235
+ for _, v := range g[u] {
236
+ if !vis[v] {
237
+ vis[v] = true
238
+ q = append(q, pair{v, p / float64(cnt)})
239
+ }
215
240
}
216
241
}
217
- t--
218
242
}
219
243
return 0
220
244
}
221
245
```
222
246
247
+ ### ** TypeScript**
248
+
249
+ ``` ts
250
+ function frogPosition(
251
+ n : number ,
252
+ edges : number [][],
253
+ t : number ,
254
+ target : number ,
255
+ ): number {
256
+ const g: number [][] = Array .from ({ length: n + 1 }, () => []);
257
+ for (const [u, v] of edges ) {
258
+ g [u ].push (v );
259
+ g [v ].push (u );
260
+ }
261
+ const q: number [][] = [[1 , 1 ]];
262
+ const vis: boolean [] = Array .from ({ length: n + 1 }, () => false );
263
+ vis [1 ] = true ;
264
+ for (; q .length > 0 && t >= 0 ; -- t ) {
265
+ for (let k = q .length ; k > 0 ; -- k ) {
266
+ const [u, p] = q .shift ()! ;
267
+ const cnt = g [u ].filter (v => ! vis [v ]).length ;
268
+ if (u === target ) {
269
+ return cnt * t === 0 ? p : 0 ;
270
+ }
271
+ for (const v of g [u ]) {
272
+ if (! vis [v ]) {
273
+ vis [v ] = true ;
274
+ q .push ([v , p / cnt ]);
275
+ }
276
+ }
277
+ }
278
+ }
279
+ return 0 ;
280
+ }
281
+ ```
282
+
223
283
### ** ...**
224
284
225
285
```
0 commit comments