Submission #1109575

#TimeUsernameProblemLanguageResultExecution timeMemory
1109575nh0902Commuter Pass (JOI18_commuter_pass)C++14
15 / 100
279 ms35764 KiB
#include <bits/stdc++.h> using namespace std; const int N = 110000; long long const inf = 1e16; int n, m, s, t, u, v; vector<pair<int, long long>> g[N]; vector<int> in[N], out[N]; long long min_dist[N]; long long D[N][4]; bool visited[N]; bool visit[N]; bool vst[N][4]; struct cmp{ bool operator() (pair<long long, int> a, pair<long long, int> b) { return a.first > b.first; } }; struct cmp2{ bool operator() (pair<pair<long long, int>, int> a, pair<pair<long long, int>, int> b) { return a.first.first > b.first.first; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m >> s >> t >> u >> v; int a, b; long long c; for (int i = 1; i <= m; i ++) { cin >> a >> b >> c; g[a].push_back({b, c}); g[b].push_back({a, c}); } priority_queue<pair<long long, int>, vector<pair<long long, int>>, cmp> pq; for (int i = 1; i <= n; i ++) { min_dist[i] = inf; } min_dist[s] = 0; pq.push({0, s}); while(!pq.empty()) { auto [d, x] = pq.top(); pq.pop(); if (visited[x]) continue; visited[x] = true; for (pair<int, long long> e : g[x]) { if (min_dist[e.first] > e.second + d) { min_dist[e.first] = e.second + d; pq.push({e.second + d, e.first}); } } } queue<int> q; q.push(t); visit[t] = true; while (!q.empty()) { int x = q.front(); q.pop(); for (pair<int, long long> e : g[x]) { if (min_dist[e.first] + e.second == min_dist[x]) { if (!visit[e.first]) { in[x].push_back(e.first); out[e.first].push_back(x); q.push(e.first); visit[e.first] = true; } } } } priority_queue<pair<pair<long long, int>, int>, vector<pair<pair<long long, int>, int>>, cmp2> pq2; for (int i = 1; i <= n; i ++) { D[i][0] = D[i][1] = D[i][2] = D[i][3] = inf; } D[u][0] = 0; pq2.push({{0, u}, 0}); while (!pq2.empty()) { auto [p, t] = pq2.top(); auto [d, x] = p; pq2.pop(); if (vst[x][t]) continue; vst[x][t] = true; if (t == 0) { for (int e : out[x]) { if (D[e][1] > d) { D[e][1] = d; pq2.push({{d, e}, 1}); } } for (int e : in[x]) { if (D[e][2] > d) { D[e][2] = d; pq2.push({{d, e}, 2}); } } for (auto e : g[x]) { if (D[e.first][0] > d + e.second) { D[e.first][0] = d + e.second; pq2.push({{d + e.second, e.first}, 0}); } } } if (t == 1) { for (int e : out[x]) { if (D[e][1] > d) { D[e][1] = d; pq2.push({{d, e}, 1}); } } for (auto e : g[x]) { if (D[e.first][3] > d + e.second) { D[e.first][3] = d + e.second; pq2.push({{d + e.second, e.first}, 3}); } } } if (t == 2) { for (int e : in[x]) { if (D[e][2] > d) { D[e][2] = d; pq2.push({{d, e}, 2}); } } for (auto e : g[x]) { if (D[e.first][3] > d + e.second) { D[e.first][3] = d + e.second; pq2.push({{d + e.second, e.first}, 3}); } } } if (t == 3) { for (auto e : g[x]) { if (D[e.first][3] > d + e.second) { D[e.first][3] = d + e.second; pq2.push({{d + e.second, e.first}, 3}); } } } } cout << min(min(D[v][0], D[v][1]), min(D[v][2], D[v][3])); return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:63:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   63 |         auto [d, x] = pq.top();
      |              ^
commuter_pass.cpp:108:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  108 |         auto [p, t]  = pq2.top();
      |              ^
commuter_pass.cpp:109:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  109 |         auto [d, x] = p;
      |              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...