제출 #1222283

#제출 시각아이디문제언어결과실행 시간메모리
1222283ffeyyaae_Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
159 ms19912 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e5+5; const ll INF = LLONG_MAX/2; int n, m, u, v, s, t; vector<pair<int,int>> adj[N]; vector<int> adj2[N]; ll disu[N], disv[N], disS[N]; ll dp[N][2][2]; void dijkstra( int st, ll dis[] ) { for( int i=1;i<=n;i++ ) dis[i] = INF; dis[st] = 0; priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<pair<ll,ll>>> pq; pq.push( {0, st} ); while( !pq.empty() ) { auto [cost, u] = pq.top(); pq.pop(); for( auto [v, w] : adj[u] ) { if( dis[v] > cost+w ) { dis[v] = cost+w; pq.push( {cost+w, v} ); } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> s >> t >> u >> v; while( m-- ) { int u, v, w; cin >> u >> v >> w; adj[u].push_back( {v, w} ); adj[v].push_back( {u, w} ); } dijkstra( u, disu ); dijkstra( v, disv ); dijkstra( s, disS ); for( int u=1;u<=n;u++ ) { for( auto [v, w] : adj[u] ) { if( disS[v]+w == disS[u] ) { adj2[u].push_back( v ); } } } vector<int> ord(n); iota( ord.begin(), ord.end(), 1 ); sort( ord.begin(), ord.end(), [&](int i, int j){ return disS[i] < disS[j]; } ); for( int i=1;i<=n;i++ ) { for( int j=0;j<2;j++ ) for( int k=0;k<2;k++ ) dp[i][j][k] = INF; } dp[s][0][0] = 0; for( auto u : ord ) { for( auto v : adj2[u] ) { for( int i=0;i<2;i++ ) { for( int j=0;j<2;j++ ) dp[u][i][j] = min( dp[u][i][j], dp[v][i][j] ); } } dp[u][0][1] = min( dp[u][0][1], dp[u][0][0]+disu[u] ); dp[u][1][0] = min( dp[u][1][0], dp[u][0][0]+disv[u] ); dp[u][1][1] = min( {dp[u][1][1], dp[u][1][0]+disu[u], dp[u][0][1]+disv[u]} ); } cout << min( dp[t][1][1], disu[v] ) << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...