86
86
87
87
<!-- 这里可写通用的实现逻辑 -->
88
88
89
- 用 BFS 获取主服务器 0 到每个数据服务器的最短距离 step。每个数据服务器 v 从发出信息到收到主服务器的响应信息,所经过的距离(或者时间) ` d = step * 2 ` ,由于数据服务器 v 可能每隔 ` t = patience[v] ` 就会重复发送一次消息,可以推算出每个数据服务器 v 最后一次发送消息的时间是 ` ⌊(d - 1) / t⌋ * t ` ,所以它最后一次收到主服务器的响应信息时间是 ` ⌊(d - 1) / t⌋ * t + d ` ,空闲时间是 ` ⌊(d - 1) / t⌋ * t + d + 1 ` ,找出所有空间时间的最大值即可。
89
+ ** 方法一:BFS**
90
+
91
+ 我们先根据二维数组 $edges$ 构建无向图 $g$,其中 $g[ u] $ 表示节点 $u$ 的所有邻居节点。
92
+
93
+ 然后,我们可以使用广度优先搜索的方式,找出每个节点 $i$ 距离主服务器的最短距离 $d_i$,那么节点 $i$ 发出信息后,最早能收到回复的时间为 $2 \times d_i$。由于每个数据服务器 $i$ 每隔 $patience[ i] $ 会重发一条信息,因此,每个数据服务器最后一次发出信息的时间为 $(2 \times d_i - 1) / patience[ i] \times patience[ i] $,那么最后收到回复的时间为 $(2 \times d_i - 1) / patience[ i] \times patience[ i] + 2 \times d_i$,再加上 $1$ 秒的处理时间,即为该数据服务器变为空闲的最早时间。我们找出最晚的这个时间,即为计算机网络变为空闲的最早时间。
94
+
95
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为节点数。
90
96
91
97
<!-- tabs:start -->
92
98
@@ -103,18 +109,17 @@ class Solution:
103
109
g[v].append(u)
104
110
q = deque([0 ])
105
111
vis = {0 }
106
- ans = step = 0
112
+ ans = d = 0
107
113
while q:
108
- step += 1
114
+ d += 1
115
+ t = d * 2
109
116
for _ in range (len (q)):
110
117
u = q.popleft()
111
118
for v in g[u]:
112
- if v in vis:
113
- continue
114
- vis.add(v)
115
- q.append(v)
116
- d, t = step * 2 , patience[v]
117
- ans = max (ans, (d - 1 ) // t * t + d + 1 )
119
+ if v not in vis:
120
+ vis.add(v)
121
+ q.append(v)
122
+ ans = max (ans, (t - 1 ) // patience[v] * patience[v] + t + 1 )
118
123
return ans
119
124
```
120
125
@@ -127,37 +132,35 @@ class Solution {
127
132
public int networkBecomesIdle (int [][] edges , int [] patience ) {
128
133
int n = patience. length;
129
134
List<Integer > [] g = new List [n];
130
- boolean [] vis = new boolean [n];
131
135
Arrays . setAll(g, k - > new ArrayList<> ());
132
136
for (int [] e : edges) {
133
137
int u = e[0 ], v = e[1 ];
134
138
g[u]. add(v);
135
139
g[v]. add(u);
136
140
}
137
- int ans = 0 ;
138
- int step = 0 ;
139
141
Deque<Integer > q = new ArrayDeque<> ();
140
142
q. offer(0 );
143
+ boolean [] vis = new boolean [n];
141
144
vis[0 ] = true ;
145
+ int ans = 0 , d = 0 ;
142
146
while (! q. isEmpty()) {
143
- ++ step;
147
+ ++ d;
148
+ int t = d * 2 ;
144
149
for (int i = q. size(); i > 0 ; -- i) {
145
150
int u = q. poll();
146
151
for (int v : g[u]) {
147
- if (vis[v]) {
148
- continue ;
152
+ if (! vis[v]) {
153
+ vis[v] = true ;
154
+ q. offer(v);
155
+ ans = Math . max(ans, (t - 1 ) / patience[v] * patience[v] + t + 1 );
149
156
}
150
- vis[v] = true ;
151
- q. offer(v);
152
- int d = step * 2 ;
153
- int t = patience[v];
154
- ans = Math . max(ans, (d - 1 ) / t * t + d + 1 );
155
157
}
156
158
}
157
159
}
158
160
return ans;
159
161
}
160
162
}
163
+
161
164
```
162
165
163
166
### ** C++**
@@ -167,27 +170,29 @@ class Solution {
167
170
public:
168
171
int networkBecomesIdle(vector<vector<int >>& edges, vector<int >& patience) {
169
172
int n = patience.size();
170
- vector<vector<int >> g(n);
171
- vector<bool > vis(n);
173
+ vector<int > g[ n] ;
172
174
for (auto& e : edges) {
173
175
int u = e[ 0] , v = e[ 1] ;
174
176
g[ u] .push_back(v);
175
177
g[ v] .push_back(u);
176
178
}
177
179
queue<int > q{{0}};
180
+ bool vis[ n] ;
181
+ memset(vis, false, sizeof(vis));
178
182
vis[ 0] = true;
179
- int ans = 0, step = 0;
183
+ int ans = 0, d = 0;
180
184
while (!q.empty()) {
181
- ++step;
182
- for (int i = q.size(); i > 0; --i) {
185
+ ++d;
186
+ int t = d * 2;
187
+ for (int i = q.size(); i; --i) {
183
188
int u = q.front();
184
189
q.pop();
185
190
for (int v : g[ u] ) {
186
- if (vis[ v] ) continue;
187
- vis[ v] = true;
188
- q.push(v);
189
- int d = step * 2, t = patience[ v] ;
190
- ans = max(ans, (d - 1) / t * t + d + 1);
191
+ if (! vis[ v] ) {
192
+ vis[ v] = true;
193
+ q.push(v);
194
+ ans = max(ans, (t - 1) / patience[ v] * patience [ v ] + t + 1) ;
195
+ }
191
196
}
192
197
}
193
198
}
@@ -199,35 +204,32 @@ public:
199
204
### **Go**
200
205
201
206
```go
202
- func networkBecomesIdle(edges [][]int, patience []int) int {
207
+ func networkBecomesIdle(edges [][]int, patience []int) (ans int) {
203
208
n := len(patience)
204
209
g := make([][]int, n)
205
- vis := make([]bool, n)
206
210
for _, e := range edges {
207
211
u, v := e[0], e[1]
208
212
g[u] = append(g[u], v)
209
213
g[v] = append(g[v], u)
210
214
}
211
215
q := []int{0}
216
+ vis := make([]bool, n)
212
217
vis[0] = true
213
- ans, step := 0, 0
214
- for len(q) > 0 {
215
- step++
218
+ for d := 1; len(q) > 0; d++ {
219
+ t := d * 2
216
220
for i := len(q); i > 0; i-- {
217
221
u := q[0]
218
222
q = q[1:]
219
223
for _, v := range g[u] {
220
- if vis[v] {
221
- continue
224
+ if !vis[v] {
225
+ vis[v] = true
226
+ q = append(q, v)
227
+ ans = max(ans, (t-1)/patience[v]*patience[v]+t+1)
222
228
}
223
- vis[v] = true
224
- q = append(q, v)
225
- d, t := step*2, patience[v]
226
- ans = max(ans, (d-1)/t*t+d+1)
227
229
}
228
230
}
229
231
}
230
- return ans
232
+ return
231
233
}
232
234
233
235
func max(a, b int) int {
@@ -238,6 +240,38 @@ func max(a, b int) int {
238
240
}
239
241
```
240
242
243
+ ### ** TypeScript**
244
+
245
+ ``` ts
246
+ function networkBecomesIdle(edges : number [][], patience : number []): number {
247
+ const n = patience .length ;
248
+ const g: number [][] = Array .from ({ length: n }, () => []);
249
+ for (const [u, v] of edges ) {
250
+ g [u ].push (v );
251
+ g [v ].push (u );
252
+ }
253
+ const vis: boolean [] = Array .from ({ length: n }, () => false );
254
+ vis [0 ] = true ;
255
+ let q: number [] = [0 ];
256
+ let ans = 0 ;
257
+ for (let d = 1 ; q .length > 0 ; ++ d ) {
258
+ const t = d * 2 ;
259
+ const nq: number [] = [];
260
+ for (const u of q ) {
261
+ for (const v of g [u ]) {
262
+ if (! vis [v ]) {
263
+ vis [v ] = true ;
264
+ nq .push (v );
265
+ ans = Math .max (ans , (((t - 1 ) / patience [v ]) | 0 ) * patience [v ] + t + 1 );
266
+ }
267
+ }
268
+ }
269
+ q = nq ;
270
+ }
271
+ return ans ;
272
+ }
273
+ ```
274
+
241
275
### ** ...**
242
276
243
277
```
0 commit comments