-
Notifications
You must be signed in to change notification settings - Fork 0
/
34_28Jul_Second Minimum Time to Reach Destination.cpp
46 lines (40 loc) · 1.45 KB
/
34_28Jul_Second Minimum Time to Reach Destination.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution {
public:
#define P pair<int, int>
int secondMinimum(int n, vector<vector<int>>& edges, int time, int change) {
unordered_map<int, vector<int>> adj(n + 1);
for (auto& edge : edges) {
int u = edge[0];
int v = edge[1];
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> d1(n + 1, INT_MAX);
vector<int> d2(n + 1, INT_MAX);
priority_queue<P, vector<P>, greater<P>> pq;
pq.push({0, 1});
d1[1] = 0;
while (!pq.empty()) {
auto [timePassed, node] = pq.top();
pq.pop();
if (d2[n] != INT_MAX && node == n) { //We reached n 2nd time means it's the second minimum
return d2[n];
}
int mult = timePassed / change;
if(mult % 2 == 1) { //Red
timePassed = change * (mult + 1); //to set green
}
for (auto& nbr : adj[node]) {
if (d1[nbr] > timePassed + time) { //+time for this edge to reach nbr
d2[nbr] = d1[nbr];
d1[nbr] = timePassed + time;
pq.push({timePassed + time, nbr});
} else if (d2[nbr] > timePassed + time && d1[nbr] != timePassed + time) {
d2[nbr] = timePassed + time;
pq.push({timePassed + time, nbr});
}
}
}
return -1;
}
};