Submission #294975

#TimeUsernameProblemLanguageResultExecution timeMemory
294975thebesCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
502 ms31212 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; #define F first #define S second const int MN = 1e5+5, MM = 2e5+5; int N, M, i, j, x, y, w, S, T, U, V, ww[MM], nd[4], deg[MN]; vector<pll> adj[MN]; vector<int> dag[MN]; ll dis[4][MN], dp[MN][2], ans; priority_queue<pll,vector<pll>,greater<pll>> q; queue<int> Q; pll ed[MM]; inline void dij(int idx){ memset(dis[idx],-1,sizeof(dis[idx])); int st = nd[idx]; q.push({0, st}); while(q.size()){ pll cur = q.top(); q.pop(); if(dis[idx][cur.S]!=-1) continue; dis[idx][cur.S] = cur.F; for(auto v : adj[cur.S]){ if(dis[idx][v.F]!=-1) continue; q.push({cur.F+v.S,v.F}); } } } int main(){ scanf("%d%d%d%d%d%d",&N,&M,&S,&T,&U,&V); nd[0]=S, nd[1]=T, nd[2]=U, nd[3]=V; for(i=1;i<=M;i++){ scanf("%d%d%d",&x,&y,&w); ed[i] = {x, y}; ww[i] = w; adj[x].push_back({y, w}); adj[y].push_back({x, w}); } for(i=0;i<4;i++) dij(i); for(i=1;i<=M;i++){ x = ed[i].F, y = ed[i].S; if(dis[0][x]>dis[0][y]) swap(x,y); if(dis[0][x]+dis[1][y]+ww[i]==dis[0][T]){ dag[y].push_back(x); deg[x]++; } } ans = 1LL<<60; for(i=1;i<=N;i++){ if(!deg[i]) Q.push(i); } memset(dp,0x3f,sizeof(dp)); while(Q.size()){ x = Q.front(); Q.pop(); for(i=0;i<2;i++) dp[x][i] = min(dp[x][i], dis[i^2][x]); for(i=0;i<2;i++) ans = min(ans, dp[x][i]+dis[i^3][x]); for(auto v : dag[x]){ deg[v] --; if(!deg[v]) Q.push(v); for(i=0;i<2;i++) dp[v][i] = min(dp[v][i], dp[x][i]); } } printf("%lld\n",ans); return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:31:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   31 |     scanf("%d%d%d%d%d%d",&N,&M,&S,&T,&U,&V);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:34:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   34 |         scanf("%d%d%d",&x,&y,&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...