Submission #853970

#TimeUsernameProblemLanguageResultExecution timeMemory
853970trytovoiCommuter Pass (JOI18_commuter_pass)C++14
40 / 100
146 ms15084 KiB
#include <bits/stdc++.h> using namespace std; template<typename T> bool ckmin(T& x, const T& y) { return x > y ? x = y, 1 : 0; } template<typename T> bool ckmax(T& x, const T& y) { return x < y ? x = y, 1 : 0; } const long long INF = (long long) 1e18; const int MAX_NODE = (int) 1e5 + 5; const int MAX_EDGE = (int) 2e5 + 5; int n, m; int S, T, U, V; vector<pair<int, int>> adj[MAX_NODE]; struct Data { int u; long long w; Data(int _u = 0, long long _w = 0) { u = _u; w = _w; } bool operator < (const Data& other) const { return w > other.w; } }; namespace SUBTASK_1 { void dijkstra(int s, vector<long long>& dist) { priority_queue<Data> Q; Q.push(Data(s, dist[s] = 0)); while (!Q.empty()) { auto [u, du] = Q.top(); Q.pop(); if (du != dist[u]) continue; for (auto [v, dv] : adj[u]) { long long cost = du + dv; if (ckmin(dist[v], cost)) Q.push(Data(v, dist[v])); } } } void solve(void) { vector<long long> distSU(n + 1, INF); dijkstra(S, distSU); vector<long long> distT(n + 1, INF); dijkstra(T, distT); vector<long long> distV(n + 1, INF); dijkstra(V, distV); long long ans = distV[U]; for (int i = 1; i <= n; ++i) if (distSU[i] + distT[i] == distSU[T]) ckmin(ans, distV[i]); cout << ans << '\n'; } } namespace SUBTASK_3 { const int MX = 303; long long dist[MX][MX]; void solve(void) { memset(dist, 0x3f, sizeof dist); for (int i = 1; i <= n; ++i) { dist[i][i] = 0; for (auto [v, w] : adj[i]) dist[i][v] = dist[v][i] = w; } for (int k = 1; k <= n; ++k) for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) ckmin(dist[i][j], dist[i][k] + dist[k][j]); long long ans = dist[U][V]; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (dist[S][i] + dist[i][j] + dist[j][T] == dist[S][T]) ckmin(ans, min(dist[V][i] + dist[j][U], dist[U][i] + dist[j][V])); cout << ans << '\n'; } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> S >> T >> U >> V; for (int i = 1; i <= m; ++i) { int u, v, w; cin >> u >> v >> w; adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); } if (S == U) { SUBTASK_1::solve(); return 0; } if (n <= 300) { SUBTASK_3::solve(); return 0; } return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'void SUBTASK_1::dijkstra(int, std::vector<long long int>&)':
commuter_pass.cpp:34:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   34 |             auto [u, du] = Q.top(); Q.pop();
      |                  ^
commuter_pass.cpp:37:23: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   37 |             for (auto [v, dv] : adj[u]) {
      |                       ^
commuter_pass.cpp: In function 'void SUBTASK_3::solve()':
commuter_pass.cpp:69:23: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   69 |             for (auto [v, w] : adj[i]) dist[i][v] = dist[v][i] = w;
      |                       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...