Submission #42113

#TimeUsernameProblemLanguageResultExecution timeMemory
42113nonocutCommuter Pass (JOI18_commuter_pass)C++14
15 / 100
2072 ms262144 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define X first #define Y second const int maxn = 100005; const ll inf = 1e18; struct node { int x; ll val; node(int _x = 0, ll _val = 0) { x = _x; val = _val; }; bool operator < (node a) const { return a.val<val; } }; int n,m,a,b,c,d; bool vis[maxn]; ll dist[maxn], da[maxn], db[maxn], dc[maxn], dd[maxn]; vector<pair<int,ll>> way[maxn]; priority_queue<node> heap; vector<int> from[maxn]; vector<int> topo; ll mn[maxn]; ll ans; void sssp(int u) { for(int i=1;i<=n;i++) dist[i] = inf, vis[i] = 0; dist[u] = 0; heap.push(node(u,0)); while(!heap.empty()) { int u = heap.top().x; heap.pop(); if(vis[u]) continue; vis[u] = 1; for(auto t : way[u]) { if(dist[t.X] > dist[u] + t.Y) { dist[t.X] = dist[u] + t.Y; heap.push(node(t.X,dist[t.X])); } } } } void tsort(int u) { for(auto v : from[u]) tsort(v); topo.push_back(u); } void solve() { for(int x=1;x<=n;x++) mn[x] = dc[x]; for(auto u : topo) { ans = min(ans, mn[u] + dd[u]); for(auto v : from[u]) { mn[v] = min(mn[v], mn[u]); } } } int main() { scanf("%d%d",&n,&m); scanf("%d%d%d%d",&a,&b,&c,&d); for(int i=0;i<m;i++) { int x,y; ll val; scanf("%d%d%lld",&x,&y,&val); way[x].pb({y,val}); way[y].pb({x,val}); } sssp(a); for(int i=1;i<=n;i++) da[i] = dist[i]; sssp(b); for(int i=1;i<=n;i++) db[i] = dist[i]; sssp(c); for(int i=1;i<=n;i++) dc[i] = dist[i]; sssp(d); for(int i=1;i<=n;i++) dd[i] = dist[i]; for(int x=1;x<=n;x++) { for(auto t : way[x]) { if(da[x]+db[t.X]+t.Y==da[b]) from[x].pb(t.X); } } tsort(a); reverse(topo.begin(),topo.end()); ans = dc[d]; solve(); swap(dc,dd); solve(); printf("%lld",ans); }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:67:24: 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:68:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d",&a,&b,&c,&d);
                                  ^
commuter_pass.cpp:71:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%lld",&x,&y,&val);
                                     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...