Skip to content

Commit 02ddd6f

Browse files
committed
feat: add solutions to lc problem: No.2039
No.2039.The Time When the Network Becomes Idle
1 parent 39148bc commit 02ddd6f

File tree

6 files changed

+412
-2
lines changed

6 files changed

+412
-2
lines changed

solution/2000-2099/2039.The Time When the Network Becomes Idle/README.md

Lines changed: 141 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,162 @@
8686

8787
<!-- 这里可写通用的实现逻辑 -->
8888

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`,找出所有空间时间的最大值即可。
90+
8991
<!-- tabs:start -->
9092

9193
### **Python3**
9294

9395
<!-- 这里可写当前语言的特殊实现逻辑 -->
9496

9597
```python
96-
98+
class Solution:
99+
def networkBecomesIdle(self, edges: List[List[int]], patience: List[int]) -> int:
100+
g = defaultdict(list)
101+
for u, v in edges:
102+
g[u].append(v)
103+
g[v].append(u)
104+
q = deque([0])
105+
vis = {0}
106+
ans = step = 0
107+
while q:
108+
step += 1
109+
for _ in range(len(q)):
110+
u = q.popleft()
111+
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)
118+
return ans
97119
```
98120

99121
### **Java**
100122

101123
<!-- 这里可写当前语言的特殊实现逻辑 -->
102124

103125
```java
126+
class Solution {
127+
public int networkBecomesIdle(int[][] edges, int[] patience) {
128+
int n = patience.length;
129+
List<Integer>[] g = new List[n];
130+
boolean[] vis = new boolean[n];
131+
for (int i = 0; i < n; ++i) {
132+
g[i] = new ArrayList<>();
133+
}
134+
for (int[] e : edges) {
135+
int u = e[0], v = e[1];
136+
g[u].add(v);
137+
g[v].add(u);
138+
}
139+
int ans = 0;
140+
int step = 0;
141+
Deque<Integer> q = new ArrayDeque<>();
142+
q.offer(0);
143+
vis[0] = true;
144+
while (!q.isEmpty()) {
145+
++step;
146+
for (int i = q.size(); i > 0; --i) {
147+
int u = q.poll();
148+
for (int v : g[u]) {
149+
if (vis[v]) {
150+
continue;
151+
}
152+
vis[v] = true;
153+
q.offer(v);
154+
int d = step * 2;
155+
int t = patience[v];
156+
ans = Math.max(ans, (d - 1) / t * t + d + 1);
157+
}
158+
}
159+
}
160+
return ans;
161+
}
162+
}
163+
```
164+
165+
### **C++**
166+
167+
```cpp
168+
class Solution {
169+
public:
170+
int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) {
171+
int n = patience.size();
172+
vector<vector<int>> g(n);
173+
vector<bool> vis(n);
174+
for (auto& e : edges)
175+
{
176+
int u = e[0], v = e[1];
177+
g[u].push_back(v);
178+
g[v].push_back(u);
179+
}
180+
queue<int> q{{0}};
181+
vis[0] = true;
182+
int ans = 0, step = 0;
183+
while (!q.empty())
184+
{
185+
++step;
186+
for (int i = q.size(); i > 0; --i)
187+
{
188+
int u = q.front();
189+
q.pop();
190+
for (int v : g[u])
191+
{
192+
if (vis[v]) continue;
193+
vis[v] = true;
194+
q.push(v);
195+
int d = step * 2, t = patience[v];
196+
ans = max(ans, (d - 1) / t * t + d + 1);
197+
}
198+
}
199+
}
200+
return ans;
201+
}
202+
};
203+
```
104204
205+
### **Go**
206+
207+
```go
208+
func networkBecomesIdle(edges [][]int, patience []int) int {
209+
n := len(patience)
210+
g := make([][]int, n)
211+
vis := make([]bool, n)
212+
for _, e := range edges {
213+
u, v := e[0], e[1]
214+
g[u] = append(g[u], v)
215+
g[v] = append(g[v], u)
216+
}
217+
q := []int{0}
218+
vis[0] = true
219+
ans, step := 0, 0
220+
for len(q) > 0 {
221+
step++
222+
for i := len(q); i > 0; i-- {
223+
u := q[0]
224+
q = q[1:]
225+
for _, v := range g[u] {
226+
if vis[v] {
227+
continue
228+
}
229+
vis[v] = true
230+
q = append(q, v)
231+
d, t := step*2, patience[v]
232+
ans = max(ans, (d-1)/t*t+d+1)
233+
}
234+
}
235+
}
236+
return ans
237+
}
238+
239+
func max(a, b int) int {
240+
if a > b {
241+
return a
242+
}
243+
return b
244+
}
105245
```
106246

107247
### **...**

solution/2000-2099/2039.The Time When the Network Becomes Idle/README_EN.md

Lines changed: 141 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,158 @@ From the beginning of the second 3, the network becomes idle.
8181

8282
## Solutions
8383

84+
BFS.
85+
8486
<!-- tabs:start -->
8587

8688
### **Python3**
8789

8890
```python
89-
91+
class Solution:
92+
def networkBecomesIdle(self, edges: List[List[int]], patience: List[int]) -> int:
93+
g = defaultdict(list)
94+
for u, v in edges:
95+
g[u].append(v)
96+
g[v].append(u)
97+
q = deque([0])
98+
vis = {0}
99+
ans = step = 0
100+
while q:
101+
step += 1
102+
for _ in range(len(q)):
103+
u = q.popleft()
104+
for v in g[u]:
105+
if v in vis:
106+
continue
107+
vis.add(v)
108+
q.append(v)
109+
d, t = step * 2, patience[v]
110+
ans = max(ans, (d - 1) // t * t + d + 1)
111+
return ans
90112
```
91113

92114
### **Java**
93115

94116
```java
117+
class Solution {
118+
public int networkBecomesIdle(int[][] edges, int[] patience) {
119+
int n = patience.length;
120+
List<Integer>[] g = new List[n];
121+
boolean[] vis = new boolean[n];
122+
for (int i = 0; i < n; ++i) {
123+
g[i] = new ArrayList<>();
124+
}
125+
for (int[] e : edges) {
126+
int u = e[0], v = e[1];
127+
g[u].add(v);
128+
g[v].add(u);
129+
}
130+
int ans = 0;
131+
int step = 0;
132+
Deque<Integer> q = new ArrayDeque<>();
133+
q.offer(0);
134+
vis[0] = true;
135+
while (!q.isEmpty()) {
136+
++step;
137+
for (int i = q.size(); i > 0; --i) {
138+
int u = q.poll();
139+
for (int v : g[u]) {
140+
if (vis[v]) {
141+
continue;
142+
}
143+
vis[v] = true;
144+
q.offer(v);
145+
int d = step * 2;
146+
int t = patience[v];
147+
ans = Math.max(ans, (d - 1) / t * t + d + 1);
148+
}
149+
}
150+
}
151+
return ans;
152+
}
153+
}
154+
```
155+
156+
### **C++**
157+
158+
```cpp
159+
class Solution {
160+
public:
161+
int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) {
162+
int n = patience.size();
163+
vector<vector<int>> g(n);
164+
vector<bool> vis(n);
165+
for (auto& e : edges)
166+
{
167+
int u = e[0], v = e[1];
168+
g[u].push_back(v);
169+
g[v].push_back(u);
170+
}
171+
queue<int> q{{0}};
172+
vis[0] = true;
173+
int ans = 0, step = 0;
174+
while (!q.empty())
175+
{
176+
++step;
177+
for (int i = q.size(); i > 0; --i)
178+
{
179+
int u = q.front();
180+
q.pop();
181+
for (int v : g[u])
182+
{
183+
if (vis[v]) continue;
184+
vis[v] = true;
185+
q.push(v);
186+
int d = step * 2, t = patience[v];
187+
ans = max(ans, (d - 1) / t * t + d + 1);
188+
}
189+
}
190+
}
191+
return ans;
192+
}
193+
};
194+
```
95195
196+
### **Go**
197+
198+
```go
199+
func networkBecomesIdle(edges [][]int, patience []int) int {
200+
n := len(patience)
201+
g := make([][]int, n)
202+
vis := make([]bool, n)
203+
for _, e := range edges {
204+
u, v := e[0], e[1]
205+
g[u] = append(g[u], v)
206+
g[v] = append(g[v], u)
207+
}
208+
q := []int{0}
209+
vis[0] = true
210+
ans, step := 0, 0
211+
for len(q) > 0 {
212+
step++
213+
for i := len(q); i > 0; i-- {
214+
u := q[0]
215+
q = q[1:]
216+
for _, v := range g[u] {
217+
if vis[v] {
218+
continue
219+
}
220+
vis[v] = true
221+
q = append(q, v)
222+
d, t := step*2, patience[v]
223+
ans = max(ans, (d-1)/t*t+d+1)
224+
}
225+
}
226+
}
227+
return ans
228+
}
229+
230+
func max(a, b int) int {
231+
if a > b {
232+
return a
233+
}
234+
return b
235+
}
96236
```
97237

98238
### **...**
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
public:
3+
int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) {
4+
int n = patience.size();
5+
vector<vector<int>> g(n);
6+
vector<bool> vis(n);
7+
for (auto& e : edges)
8+
{
9+
int u = e[0], v = e[1];
10+
g[u].push_back(v);
11+
g[v].push_back(u);
12+
}
13+
queue<int> q{{0}};
14+
vis[0] = true;
15+
int ans = 0, step = 0;
16+
while (!q.empty())
17+
{
18+
++step;
19+
for (int i = q.size(); i > 0; --i)
20+
{
21+
int u = q.front();
22+
q.pop();
23+
for (int v : g[u])
24+
{
25+
if (vis[v]) continue;
26+
vis[v] = true;
27+
q.push(v);
28+
int d = step * 2, t = patience[v];
29+
ans = max(ans, (d - 1) / t * t + d + 1);
30+
}
31+
}
32+
}
33+
return ans;
34+
}
35+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
func networkBecomesIdle(edges [][]int, patience []int) int {
2+
n := len(patience)
3+
g := make([][]int, n)
4+
vis := make([]bool, n)
5+
for _, e := range edges {
6+
u, v := e[0], e[1]
7+
g[u] = append(g[u], v)
8+
g[v] = append(g[v], u)
9+
}
10+
q := []int{0}
11+
vis[0] = true
12+
ans, step := 0, 0
13+
for len(q) > 0 {
14+
step++
15+
for i := len(q); i > 0; i-- {
16+
u := q[0]
17+
q = q[1:]
18+
for _, v := range g[u] {
19+
if vis[v] {
20+
continue
21+
}
22+
vis[v] = true
23+
q = append(q, v)
24+
d, t := step*2, patience[v]
25+
ans = max(ans, (d-1)/t*t+d+1)
26+
}
27+
}
28+
}
29+
return ans
30+
}
31+
32+
func max(a, b int) int {
33+
if a > b {
34+
return a
35+
}
36+
return b
37+
}

0 commit comments

Comments
 (0)