Submission #210380

#TimeUsernameProblemLanguageResultExecution timeMemory
210380SamAndCommuter Pass (JOI18_commuter_pass)C++17
40 / 100
2033 ms87892 KiB
#include <bits/stdc++.h> using namespace std; #define m_p make_pair const int N = 200005; struct ban { int x; long long d; ban(){} ban(int x, long long d) { this->x = x; this->d = d; } }; bool operator<(const ban& a, const ban& b) { return a.d > b.d; } int n, m; int s, t; int u, v; vector<ban> a[N]; map<int, map<int, long long> > d; bool c[N]; void djk(int x) { memset(c, false, sizeof c); priority_queue<ban> q; q.push(ban(x, 0)); while (1) { ban t; do { if (q.empty()) return; t = q.top(); q.pop(); } while(c[t.x]); c[t.x] = true; d[x][t.x] = t.d; d[t.x][x] = t.d; for (int i = 0; i < a[t.x].size(); ++i) { ban h = a[t.x][i]; h.d += t.d; if (!c[h.x]) q.push(h); } } } vector<int> g[N]; long long ans; long long minu[N], minv[N]; void dfs(int x) { if (c[x]) return; c[x] = true; minu[x] = d[x][u]; minv[x] = d[x][v]; for (int i = 0; i < g[x].size(); ++i) { int h = g[x][i]; dfs(h); minu[x] = min(minu[x], minu[h]); minv[x] = min(minv[x], minv[h]); } ans = min(ans, minu[x] + d[x][v]); ans = min(ans, minv[x] + d[x][u]); } int main() { scanf("%d%d", &n, &m); scanf("%d%d", &s, &t); scanf("%d%d", &v, &u); for (int i = 0; i < m; ++i) { int x, y, d; scanf("%d%d%d", &x, &y, &d); a[x].push_back(ban(y, d)); a[y].push_back(ban(x, d)); } djk(s); djk(t); djk(u); djk(v); for (int x = 1; x <= n; ++x) { for (int i = 0; i < a[x].size(); ++i) { ban h = a[x][i]; if (d[s][x] + h.d + d[h.x][t] == d[s][t]) g[x].push_back(h.x); } } ans = d[u][v]; memset(c, false, sizeof c); dfs(s); printf("%lld\n", ans); return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'void djk(int)':
commuter_pass.cpp:47:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < a[t.x].size(); ++i)
                         ~~^~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'void dfs(int)':
commuter_pass.cpp:69:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < g[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:98:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < a[x].size(); ++i)
                         ~~^~~~~~~~~~~~~
commuter_pass.cpp:82:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &m);
     ~~~~~^~~~~~~~~~~~~~~~
commuter_pass.cpp:83:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &s, &t);
     ~~~~~^~~~~~~~~~~~~~~~
commuter_pass.cpp:84:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &v, &u);
     ~~~~~^~~~~~~~~~~~~~~~
commuter_pass.cpp:88:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d", &x, &y, &d);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...