제출 #1152509

#제출 시각아이디문제언어결과실행 시간메모리
1152509koukirocksCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
164 ms18748 KiB
#include <bits/stdc++.h> #define speed ios_base::sync_with_stdio(0); cin.tie(0) #define all(x) (x).begin(),(x).end() #define F first #define S second //#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx,avx2") //#pragma GCC target("popcnt") using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ldb; typedef pair<int,int> pii; typedef pair<ll,ll> pll; const ll MAX=2e5+10,P=1e9+7; const ll INF=0x3f3f3f3f,oo=0x3f3f3f3f3f3f3f3f; const ldb eps=1e-6; const ldb PI=acos(-1.0); const int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; template<typename T> using vvector = vector<vector<T>>; void Dijkstra(int n,vvector<pll> &G,vector<ll> &dis,ll s) { priority_queue<pll> Q; vector<bool> vis(n+1); dis[s]=0; Q.push({0,s}); while (!Q.empty()) { while (!Q.empty() and vis[Q.top().S]) Q.pop(); if (Q.empty()) break; auto [d,v]=Q.top(); // cout<<v<<" v\n"; vis[v]=true; for (auto [u,w]:G[v]) { if (vis[u]) continue; if (dis[v]+w<dis[u]) { dis[u]=dis[v]+w; Q.push({-dis[u],u}); } } } } int main() { speed; ll n,m; cin>>n>>m; ll s,t,x,y; cin>>s>>t>>x>>y; vvector<pll> G(n+1); for (int i=1;i<=m;i++) { ll a,b,c; cin>>a>>b>>c; G[a].push_back({b,c}); G[b].push_back({a,c}); } vector<ll> diss(n+1,oo),disx(n+1,oo),disy(n+1,oo); Dijkstra(n,G,diss,s); Dijkstra(n,G,disx,x); Dijkstra(n,G,disy,y); // for (int i=1;i<=n;i++) cout<<diss[i]<<" "; // cout<<"diss\n"; // for (int i=1;i<=n;i++) cout<<disx[i]<<" "; // cout<<"disx\n"; // for (int i=1;i<=n;i++) cout<<disy[i]<<" "; // cout<<"disy\n"; vector<int> id(n+1); iota(all(id),0); diss[0]=-1; sort(all(id),[&](int a,int b) { return diss[a]<diss[b]; }); vector<ll> dpx(n+1,oo),dpy(n+1,oo),dpxy(n+1,oo); for (int i=1;i<=n;i++) { int v=id[i]; for (auto [u,w]:G[v]) { if (diss[u]+w==diss[v]) { dpx[v]=min(dpx[v],dpx[u]); dpy[v]=min(dpy[v],dpy[u]); dpxy[v]=min(dpxy[v],dpxy[u]); } } dpx[v]=min(dpx[v],disx[v]); dpy[v]=min(dpy[v],disy[v]); dpxy[v]=min({dpxy[v],dpx[v]+disy[v],dpy[v]+disx[v],disx[v]+disy[v]}); } // for (int i=1;i<=n;i++) cout<<dpx[i]<<" "; // cout<<"dpx\n"; // for (int i=1;i<=n;i++) cout<<dpy[i]<<" "; // cout<<"dpy\n"; // for (int i=1;i<=n;i++) cout<<dpxy[i]<<" "; // cout<<"dpxy\n"; cout<<min(dpxy[t],disx[y])<<"\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...