Submission #1270735

#TimeUsernameProblemLanguageResultExecution timeMemory
1270735notisoraCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
270 ms19748 KiB
///NotIsora ///This is my last dance #include<bits/stdc++.h> #define modulo 1000000007 #define fi first #define se second #define sq(x) (x)*(x) #define ll long long #define ld long double #define el '\n' #define pb push_back ///#define int long long using namespace std; const int N=1e5+5; const ll INF=1e15+5; int n,m; int S,T,U,V; vector<pair<int,int>>adj[N]; ll d[4][N]; ll ans=INF; bool vis[N]; ll dp[N]; void dijkstra(int start,int t){ priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>>pq; d[t][start]=0; pq.push({0,start}); while(!pq.empty()){ int s=pq.top().se; ll dis=pq.top().fi; pq.pop(); if (dis>d[t][s]) continue; for(pair<int,int>&pr:adj[s]){ int u=pr.fi; int w=pr.se; if (d[t][u]>dis+(ll)w){ d[t][u]=dis+(ll)w; pq.push({d[t][u],u}); } } } } void dfs(int node,int type){ vis[node]=1; dp[node]=d[2][node]; for(pair<int,int>&pr:adj[node]){ int u=pr.fi; int w=pr.se; if (d[type][node]==d[type][u]+(ll)w){ if (!vis[u]) dfs(u,type); dp[node]=min(dp[node],dp[u]); } } ans=min(ans,dp[node]+d[3][node]); } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); //freopen("BUS.INP","r",stdin); //freopen("BUS.OUT","w",stdout); cin>>n>>m; cin>>S>>T>>U>>V; for(int i=1;i<=m;i++){ int a,b,w; cin>>a>>b>>w; adj[a].pb({b,w}); adj[b].pb({a,w}); } for(int i=1;i<=n;i++){ for(int j=0;j<4;j++){ d[j][i]=INF; } } dijkstra(S,0); dijkstra(T,1); dijkstra(U,2); dijkstra(V,3); ans=d[2][V]; for(int i=1;i<=n;i++){ dp[i]=INF; vis[i]=0; } dfs(S,1); for(int i=1;i<=n;i++){ dp[i]=INF; vis[i]=0; } dfs(T,0); 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...