Submission #1273202

#TimeUsernameProblemLanguageResultExecution timeMemory
1273202vk3601hCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
326 ms20664 KiB
#include <bits/stdc++.h> using namespace std; const long long INF = 1e18; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v; s--, t--, u--, v--; vector<vector<pair<int, long long>>> adj(n); for (int i = 0; i < m; i++){ int a, b; long long c; cin >> a >> b >> c; a--, b--; adj[a].push_back({b, c}); adj[b].push_back({a, c}); } auto dijkstra1 = [&](int start) -> vector<long long> { vector<bool> processed(n, false); vector<long long> dist(n, INF); priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> frontier; dist[start] = 0; frontier.push({0, start}); while (!frontier.empty()){ int curr = frontier.top().second; frontier.pop(); if (processed[curr]) continue; processed[curr] = true; for (const pair<int, long long> &edge : adj[curr]){ int node = edge.first; long long cost = edge.second; if (dist[node] > dist[curr] + cost){ dist[node] = dist[curr] + cost; frontier.push({dist[node], node}); } } } return dist; }; vector<long long> dpU = dijkstra1(u); vector<long long> dpV = dijkstra1(v); auto dijkstra2 = [&](int start, int end) -> long long { vector<bool> processed(n, false); vector<long long> dist(n, INF); vector<vector<long long>> dp(2, vector<long long>(n, INF)); priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> frontier; dist[start] = 0; dp[0][start] = dpU[start]; dp[1][start] = dpV[start]; frontier.push({0, start}); while (!frontier.empty()){ int curr = frontier.top().second; frontier.pop(); if (processed[curr]) continue; processed[curr] = true; for (const pair<int, long long> &edge : adj[curr]){ int node = edge.first; long long cost = edge.second; if (dist[node] > dist[curr] + cost){ dp[0][node] = min(dpU[node], dp[0][curr]); dp[1][node] = min(dpV[node], dp[1][curr]); dist[node] = dist[curr] + cost; frontier.push({dist[node], node}); } else if (dist[node] == dist[curr] + cost && min(dpU[node], dp[0][curr]) + min(dpV[node], dp[1][curr]) < dp[0][node] + dp[1][node]){ dp[0][node] = min(dpU[node], dp[0][curr]); dp[1][node] = min(dpV[node], dp[1][curr]); } } } return dp[0][end] + dp[1][end]; }; cout << min({dpU[v], dijkstra2(s, t), dijkstra2(t, s)}); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...