Skip to content

Commit 86e8d94

Browse files
committedJan 24, 2022
feat: add solutions to lc problem: No.2045
No.2045.Second Minimum Time to Reach Destination
1 parent 40cef81 commit 86e8d94

File tree

7 files changed

+213
-7
lines changed

7 files changed

+213
-7
lines changed
 

‎solution/1700-1799/1705.Maximum Number of Eaten Apples/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class Solution {
113113
### **C++**
114114

115115
```cpp
116-
typedef pair<int,int> PII;
116+
typedef pair<int, int> PII;
117117

118118
class Solution {
119119
public:

‎solution/1700-1799/1705.Maximum Number of Eaten Apples/README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class Solution {
103103
### **C++**
104104

105105
```cpp
106-
typedef pair<int,int> PII;
106+
typedef pair<int, int> PII;
107107

108108
class Solution {
109109
public:

‎solution/1700-1799/1705.Maximum Number of Eaten Apples/Solution.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
typedef pair<int,int> PII;
1+
typedef pair<int, int> PII;
22

33
class Solution {
44
public:

‎solution/2000-2099/2045.Second Minimum Time to Reach Destination/README.md

+70-2
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,83 @@
8989
<!-- 这里可写当前语言的特殊实现逻辑 -->
9090

9191
```python
92-
92+
class Solution:
93+
def secondMinimum(self, n: int, edges: List[List[int]], time: int, change: int) -> int:
94+
g = defaultdict(set)
95+
for u, v in edges:
96+
g[u].add(v)
97+
g[v].add(u)
98+
q = deque([(1, 0)])
99+
dist = [[float('inf')] * 2 for _ in range(n + 1)]
100+
dist[1][1] = 0
101+
while q:
102+
u, d = q.popleft()
103+
for v in g[u]:
104+
if d + 1 < dist[v][0]:
105+
dist[v][0] = d + 1
106+
q.append((v, d + 1))
107+
elif dist[v][0] < d + 1 < dist[v][1]:
108+
dist[v][1] = d + 1
109+
if v == n:
110+
break
111+
q.append((v, d + 1))
112+
ans = 0
113+
for i in range(dist[n][1]):
114+
ans += time
115+
if i < dist[n][1] - 1 and (ans // change) % 2 == 1:
116+
ans = (ans + change) // change * change
117+
return ans
93118
```
94119

95120
### **Java**
96121

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

99124
```java
100-
125+
class Solution {
126+
public int secondMinimum(int n, int[][] edges, int time, int change) {
127+
List<Integer>[] g = new List[n + 1];
128+
for (int i = 0; i < n + 1; ++i) {
129+
g[i] = new ArrayList<>();
130+
}
131+
for (int[] e : edges) {
132+
int u = e[0], v = e[1];
133+
g[u].add(v);
134+
g[v].add(u);
135+
}
136+
Deque<int[]> q = new LinkedList<>();
137+
q.offerLast(new int[]{1, 0});
138+
int[][] dist = new int[n + 1][2];
139+
for (int i = 0; i < n + 1; ++i) {
140+
Arrays.fill(dist[i], Integer.MAX_VALUE);
141+
}
142+
dist[1][1] = 0;
143+
while (!q.isEmpty()) {
144+
int[] e = q.pollFirst();
145+
int u = e[0], d = e[1];
146+
for (int v : g[u]) {
147+
if (d + 1 < dist[v][0]) {
148+
dist[v][0] = d + 1;
149+
q.offerLast(new int[]{v, d + 1});
150+
} else if (dist[v][0] < d + 1 && d + 1 < dist[v][1]) {
151+
dist[v][1] = d + 1;
152+
if (v == n) {
153+
break;
154+
}
155+
q.offerLast(new int[]{v, d + 1});
156+
}
157+
}
158+
}
159+
int ans = 0;
160+
for (int i = 0; i < dist[n][1]; ++i) {
161+
ans += time;
162+
if (i < dist[n][1] - 1 && (ans / change) % 2 == 1) {
163+
ans = (ans + change) / change * change;
164+
}
165+
}
166+
return ans;
167+
}
168+
}
101169
```
102170

103171
### **...**

‎solution/2000-2099/2045.Second Minimum Time to Reach Destination/README_EN.md

+70-2
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,81 @@ The second minimum time path is 1 -&gt; 2 -&gt; 1 -&gt; 2 with time = 11 minutes
7878
### **Python3**
7979

8080
```python
81-
81+
class Solution:
82+
def secondMinimum(self, n: int, edges: List[List[int]], time: int, change: int) -> int:
83+
g = defaultdict(set)
84+
for u, v in edges:
85+
g[u].add(v)
86+
g[v].add(u)
87+
q = deque([(1, 0)])
88+
dist = [[float('inf')] * 2 for _ in range(n + 1)]
89+
dist[1][1] = 0
90+
while q:
91+
u, d = q.popleft()
92+
for v in g[u]:
93+
if d + 1 < dist[v][0]:
94+
dist[v][0] = d + 1
95+
q.append((v, d + 1))
96+
elif dist[v][0] < d + 1 < dist[v][1]:
97+
dist[v][1] = d + 1
98+
if v == n:
99+
break
100+
q.append((v, d + 1))
101+
ans = 0
102+
for i in range(dist[n][1]):
103+
ans += time
104+
if i < dist[n][1] - 1 and (ans // change) % 2 == 1:
105+
ans = (ans + change) // change * change
106+
return ans
82107
```
83108

84109
### **Java**
85110

86111
```java
87-
112+
class Solution {
113+
public int secondMinimum(int n, int[][] edges, int time, int change) {
114+
List<Integer>[] g = new List[n + 1];
115+
for (int i = 0; i < n + 1; ++i) {
116+
g[i] = new ArrayList<>();
117+
}
118+
for (int[] e : edges) {
119+
int u = e[0], v = e[1];
120+
g[u].add(v);
121+
g[v].add(u);
122+
}
123+
Deque<int[]> q = new LinkedList<>();
124+
q.offerLast(new int[]{1, 0});
125+
int[][] dist = new int[n + 1][2];
126+
for (int i = 0; i < n + 1; ++i) {
127+
Arrays.fill(dist[i], Integer.MAX_VALUE);
128+
}
129+
dist[1][1] = 0;
130+
while (!q.isEmpty()) {
131+
int[] e = q.pollFirst();
132+
int u = e[0], d = e[1];
133+
for (int v : g[u]) {
134+
if (d + 1 < dist[v][0]) {
135+
dist[v][0] = d + 1;
136+
q.offerLast(new int[]{v, d + 1});
137+
} else if (dist[v][0] < d + 1 && d + 1 < dist[v][1]) {
138+
dist[v][1] = d + 1;
139+
if (v == n) {
140+
break;
141+
}
142+
q.offerLast(new int[]{v, d + 1});
143+
}
144+
}
145+
}
146+
int ans = 0;
147+
for (int i = 0; i < dist[n][1]; ++i) {
148+
ans += time;
149+
if (i < dist[n][1] - 1 && (ans / change) % 2 == 1) {
150+
ans = (ans + change) / change * change;
151+
}
152+
}
153+
return ans;
154+
}
155+
}
88156
```
89157

90158
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class Solution {
2+
public int secondMinimum(int n, int[][] edges, int time, int change) {
3+
List<Integer>[] g = new List[n + 1];
4+
for (int i = 0; i < n + 1; ++i) {
5+
g[i] = new ArrayList<>();
6+
}
7+
for (int[] e : edges) {
8+
int u = e[0], v = e[1];
9+
g[u].add(v);
10+
g[v].add(u);
11+
}
12+
Deque<int[]> q = new LinkedList<>();
13+
q.offerLast(new int[]{1, 0});
14+
int[][] dist = new int[n + 1][2];
15+
for (int i = 0; i < n + 1; ++i) {
16+
Arrays.fill(dist[i], Integer.MAX_VALUE);
17+
}
18+
dist[1][1] = 0;
19+
while (!q.isEmpty()) {
20+
int[] e = q.pollFirst();
21+
int u = e[0], d = e[1];
22+
for (int v : g[u]) {
23+
if (d + 1 < dist[v][0]) {
24+
dist[v][0] = d + 1;
25+
q.offerLast(new int[]{v, d + 1});
26+
} else if (dist[v][0] < d + 1 && d + 1 < dist[v][1]) {
27+
dist[v][1] = d + 1;
28+
if (v == n) {
29+
break;
30+
}
31+
q.offerLast(new int[]{v, d + 1});
32+
}
33+
}
34+
}
35+
int ans = 0;
36+
for (int i = 0; i < dist[n][1]; ++i) {
37+
ans += time;
38+
if (i < dist[n][1] - 1 && (ans / change) % 2 == 1) {
39+
ans = (ans + change) / change * change;
40+
}
41+
}
42+
return ans;
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution:
2+
def secondMinimum(self, n: int, edges: List[List[int]], time: int, change: int) -> int:
3+
g = defaultdict(set)
4+
for u, v in edges:
5+
g[u].add(v)
6+
g[v].add(u)
7+
q = deque([(1, 0)])
8+
dist = [[float('inf')] * 2 for _ in range(n + 1)]
9+
dist[1][1] = 0
10+
while q:
11+
u, d = q.popleft()
12+
for v in g[u]:
13+
if d + 1 < dist[v][0]:
14+
dist[v][0] = d + 1
15+
q.append((v, d + 1))
16+
elif dist[v][0] < d + 1 < dist[v][1]:
17+
dist[v][1] = d + 1
18+
if v == n:
19+
break
20+
q.append((v, d + 1))
21+
ans = 0
22+
for i in range(dist[n][1]):
23+
ans += time
24+
if i < dist[n][1] - 1 and (ans // change) % 2 == 1:
25+
ans = (ans + change) // change * change
26+
return ans

0 commit comments

Comments
 (0)