제출 #838949

#제출 시각아이디문제언어결과실행 시간메모리
838949vjudge1Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
255 ms21280 KiB
#include <bits/stdc++.h> #define fi first #define se second #define inf 0x3f3f3f3f3f3f3f3f using namespace std; using ll = long long; const int nx=1e5+5; int n, m, s, t, u, v; ll dp[nx], d[nx][5], kq=inf; pair<ll, ll> a[nx]; vector<int> topo; struct dak { int v; ll w; bool operator <(const dak &o) const { return w>o.w; } }; priority_queue<dak> f; vector<dak> adj[nx]; void find(int u, int k) { d[u][k]=0; f.push({u, d[u][k]}); while(f.size()) { dak v=f.top(); f.pop(); if(d[v.v][k]<v.w) continue; for(auto it:adj[v.v]) { if(d[it.v][k]>d[v.v][k]+it.w) { d[it.v][k]=d[v.v][k]+it.w; f.push({it.v, d[it.v][k]}); } } } } bool cmp(pair<ll, ll> a, pair<ll, ll> b) { return a.fi>b.fi; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m>>s>>t>>u>>v; while(m--) { int a, b; ll c; cin>>a>>b>>c; adj[a].push_back({b, c}); adj[b].push_back({a, c}); } memset(d, 0x3f, sizeof(d)); memset(dp, 0x3f, sizeof(dp)); find(s, 0); find(t, 1); find(u, 2); find(v, 3); for(int i = 1; i <= n; i++) a[i]=make_pair(d[i][0], i); sort(a+1, a+n+1, cmp); for(int i = 1; i <= n; i++) topo.emplace_back(a[i].se); for(int l:topo) { if(d[l][0]+d[l][1]==d[t][0]) { dp[l] = d[1][3]; for(auto r:adj[l]) { if(d[l][0]+r.w==d[r.v][0]) dp[l]=min(dp[l], dp[r.v]); } } } kq=d[u][3]; for(int i = 1; i <= n; i++) kq=min(kq, d[i][2]+dp[i]); memset(dp, 0x3f, sizeof(dp)); for(int l:topo) { if(d[l][0]+d[l][1]==d[t][0]) { dp[l] = d[1][2]; for(auto r:adj[l]) { if(d[l][0]+r.w==d[r.v][0]) dp[l]=min(dp[l], dp[r.v]); } } } for(int i = 1; i <= n; i++) kq=min(kq, d[i][3]+dp[i]); cout<<kq; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...