Editorial for CCC '21 S4 - Daily Commute
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Subtask 1
Every possible path is a prefix of the permutation of integers
Time Complexity:
Subtask 2
If a DFS algorithm is used to compute the shortest distance from
The DFS implementation being discussed is something similar to the following (though more code is needed to account for the subway).
vector<int> g[200005];
int dist[200005];
void dfs(int u) {
int d = dist[u] + 1;
for (int v: g[u]) {
if (dist[v] > d) {
dist[v] = d;
dfs(v);
}
}
}
// DFS call. Run once per day
memset(dist, 0x3f, sizeof dist); // set all distances to "infinity" value
dist[n] = 0;
dfs(n);
Code credit:
We can prove this by considering the amount of times DFS is called for each node in the graph. From the implementation, it's evident that dfs
is called every time the shortest distance to a node "improves", and as the shortest distance to a node in the graph is bounded by dfs
will be called at most
Time Complexity:
Subtask 3
For each day, run a weighted SSSP algorithm such as Dijkstra's. Note that the subway has to be treated differently from the walkways as waiting for the subway needs to be accounted for.
Time Complexity:
Subtask 4
We can prove that an optimal answer always exists with the following constraints:
- Take some prefix of the subway
- Exit the subway and walk to node
using exclusively walkways
Assume that the only optimal trips do not respect the above constraints. Let
Thus, on each day, we simply have to check these std::multiset
in C++, TreeSet
in Java, and the heapq
package in Python (a bit more effort is needed for a priority queue to work though).
Time Complexity:
Comments
recursive dfs faced TLE :(
I tried BFS here, but I'm getting TLE on batch 4. I think I have to also store the steps it took to reach a station to speed up my solution?
Look at your time complexity. Looks something like
.
Is my approach in the right direction though? Or do I have to use another algorithm?
Try to find a method that doesn't perform a complete search of the graph each query, such as the editorial above.
I tried something similar to that, but I started from
and went to 
. I passed #4 but I got TLE on #5: https://dmoj.ca/submission/3633167
Do I have to start at
and go to 
?
Changes in trains can be treated as qurries. Instead of computing them again and again(in ur case the BFS) for each qurry(change), you should avoid doing repetitive work.
I'm not sure how to treat the trains as queries though in my current solution?
see the editorial above.
Would BFS work as well?
Yes, BFS works too