제출 #207529

#제출 시각아이디문제언어결과실행 시간메모리
207529DodgeBallManCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
452 ms18540 KiB
#include <bits/stdc++.h> #define pli pair<long long, int> #define x first #define y second using namespace std; const int N = 1e5 + 10; vector<pli> g[N]; int n, m, u, v, s, t; long long ds[N], dt[N], du[N], dv[N]; priority_queue<pli, vector<pli>, greater<pli> > q; void shortest( int st, long long d[] ) { fill( d, d+N, 1e18 ); d[st] = 0; q.emplace( pli( 0, st ) ); while( !q.empty() ) { long long di = q.top().x; int u = q.top().y; q.pop(); //cout << st << " " << u << " " << di << endl; for( pli v : g[u] ) if( d[v.x] > di + v.y ) q.emplace( pli( d[v.x] = di + v.y, v.x ) ); } } long long solve( int a, int b, long long da[], long long db[] ) { long long dp[N], len = da[b], ret = 1e18; bool chk[N]; memset( chk, 0, sizeof chk ); for( int i = 1 ; i <= n ; i++ ) dp[i] = du[i]; //for( int i = 1 ; i <= n ; i++ ) cout << dp[i] << endl; q.emplace( pli( 0, a ) ), chk[a] = true; while( !q.empty() ) { pli now = q.top(); q.pop(); if( now.x != da[now.y] ) continue; long long di; int u; tie( di, u ) = now; for( pli v : g[u] ) if( di + v.y + db[v.x] == len ) { dp[v.x] = min( dp[v.x], dp[u] ); if( !chk[v.x] ) chk[v.x] = true, q.emplace( pli( di + v.y, v.x ) ); } } for( int i = 1 ; i <= n ; i++ ) if( da[i] + db[i] == len ) ret = min( ret, dp[i] + dv[i] ); return ret; } int main() { scanf("%d %d %d %d %d %d",&n,&m,&s,&t,&u,&v); for( int i = 1, a, b ; i <= m ; i++ ) { long long c; scanf("%d %d %lld",&a,&b,&c); g[a].emplace_back( pli( b, c ) ), g[b].emplace_back( pli( a, c ) ); } shortest( s, ds ), shortest( t, dt ), shortest( u, du ), shortest( v, dv ); printf("%lld",min( du[v], min( solve( s, t, ds, dt ), solve( t, s, dt, ds ) ) ) ); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:51:10: 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:54:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %lld",&a,&b,&c);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...