Submission #240962

#TimeUsernameProblemLanguageResultExecution timeMemory
240962luciocfCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
453 ms34820 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, int> pii; const int maxn = 2e5+10; const ll inf = 1e18+10; struct Edge { int u, v, w; } edge[maxn]; int n, m; int S, T, U, V; ll dist[4][maxn]; bool mark[maxn]; ll mn[maxn]; vector<int> dag[maxn], ord; vector<pii> grafo[maxn]; void dijkstra(int q, int s) { for (int i = 1; i <= n; i++) { dist[q][i] = inf; mark[i] = false; } priority_queue<pii, vector<pii>, greater<pii>> fila; dist[q][s] = 0; fila.push({dist[q][s], s}); while (!fila.empty()) { int u = fila.top().second; fila.pop(); if (mark[u]) continue; mark[u] = true; for (auto pp: grafo[u]) { int v = pp.first, w = pp.second; if (dist[q][v] > dist[q][u] + 1ll*w) { dist[q][v] = dist[q][u] + 1ll*w; fila.push({dist[q][v], v}); } } } } void dfs(int u) { mark[u] = true; for (auto v: dag[u]) if (!mark[v]) dfs(v); ord.push_back(u); } ll get_mn(int a, int b) { ll ans = inf; for (auto u: ord) { mn[u] = dist[b][u]; for (auto v: dag[u]) mn[u] = min(mn[u], mn[v]); ans = min(ans, dist[a][u] + mn[u]); } return ans; } int main(void) { scanf("%d %d %d %d %d %d", &n, &m, &S, &T, &U, &V); for (int i = 1; i <= m; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); grafo[u].push_back({v, w}); grafo[v].push_back({u, w}); edge[i] = {u, v, w}; } dijkstra(0, S); dijkstra(1, T); dijkstra(2, U); dijkstra(3, V); for (int i = 1; i <= m; i++) { int u = edge[i].u, v = edge[i].v, w = edge[i].w; if (dist[0][u] + 1LL*w + dist[1][v] == dist[0][T]) dag[u].push_back(v); else if (dist[0][v] + 1LL*w + dist[1][u] == dist[0][T]) dag[v].push_back(u); } memset(mark, 0, sizeof mark); for (int i = 1; i <= n; i++) if (!mark[i]) dfs(i); ll ans = min({dist[2][V], get_mn(2, 3), get_mn(3, 2)}); printf("%lld\n", ans); }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:90:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d %d %d %d", &n, &m, &S, &T, &U, &V);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:95:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &u, &v, &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...