Submission #1269522

#TimeUsernameProblemLanguageResultExecution timeMemory
1269522trantrungkeinCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
209 ms32928 KiB
#include <bits/stdc++.h> #define int long long #define fi first #define si second #define For(i,a,b) for (int i = (a), _b =(b); i <= _b; ++i) #define all(v) v.begin(), v.end() #define Unique(v) v.erase(unique(all(v)), v.end()) #define MASK(i) (1LL << (i)) #define bit(i,n) (((n)>>(i)) & 1) #define Vii vector<pair<int,int>> #define setpr(x) cout<<setprecision(x)<<fixed #define Prior priority_queue< pair<int,int> , Vii, greater<Pair> > using namespace std; const int Mod = 1E9 + 7; const long long INF = 4E18; const int N = 2e5 + 1; int n,m,S,T,X,Y,ds[N],dt[N],dx[N],dy[N]; vector<pair<int,int>> g[N]; void dij(int st, int dist[], vector<pair<int,int>> g_dij[]) { For(i,1,n) dist[i] = INF; dist[st] = 0; priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> Q; Q.push({0,st}); while(!Q.empty()) { int u,W; tie(W,u) = Q.top();Q.pop(); if(dist[u] < W) continue; for(auto [v,w] : g_dij[u]) if(dist[v] > dist[u] + w) Q.push({dist[v] = dist[u] + w,v}); } } vector<int> topo; int vis_topo[N]; vector<int> adj[N]; void Topo(int u) { vis_topo[u] = 1; for(int v : adj[u]) { if(!vis_topo[v]) Topo(v); } topo.push_back(u); } struct node{int u,v,w;}; vector<node> edges; int Miny[N],Minx[N]; signed main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); //freopen("kein.inp","r",stdin) //freopen("kein.out","w",stdout); cin >> n >> m; cin >> S >> T >> X >> Y; For(i,1,m) { int u,v,w; cin >> u >> v >> w; g[u].push_back({v,w}); g[v].push_back({u,w}); edges.push_back({u,v,w}); } dij(S,ds,g);dij(T,dt,g);dij(X,dx,g);dij(Y,dy,g); for(auto[u,v,w] : edges) { if(ds[u] + w + dt[v] == ds[T]) adj[u].push_back(v); else if(dt[u] + w + ds[v] == ds[T]) adj[v].push_back(u); } Topo(S); reverse(all(topo)); For(i,1,n) Minx[i] = Miny[N] = 1e18; int ans = dx[Y]; Minx[S] = dx[S]; Miny[S] = dy[S]; for(int u : topo) { for(int v : adj[u]) { ans = min({ans,Minx[u]+dy[v],Miny[u]+dx[u]}); Minx[v] = min(Minx[u],dx[v]); Miny[v] = min(Miny[u],dy[v]); } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...