제출 #1016367

#제출 시각아이디문제언어결과실행 시간메모리
1016367sun2305Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
442 ms34292 KiB
#include <bits/stdc++.h>
#define ll long long 
#define se second
#define fi first
#define pll pair<ll,ll>
#define maxn 100005

using namespace std;

ll n,m,s,t,u,v,du[maxn],dv[maxn],ans;
vector<pll> g[maxn];

void djk1(ll st,ll d[]){
  priority_queue<pll,vector<pll>,greater<pll>> q;
  bool vs[maxn];
  fill(vs,vs+maxn,false);
  q.push({0,st});
  while(!q.empty()){
    ll node,w;
    tie(w,node)=q.top();
    q.pop();
    if(!vs[node]){
      vs[node]=true;
      d[node]+=w;
      for(pll it:g[node]) q.push({w+it.se,it.fi});
    }
  }
}

void djk2(ll st, ll ed){
  priority_queue<pair<ll,pll>,vector<pair<ll,pll>>,greater<pair<ll,pll>>> q;
  bool vs[maxn];
  ll ds[maxn],dp[3][maxn];
  fill(vs,vs+maxn,false);
  fill(dp[0], dp[0] + 100001, LLONG_MAX / 2);
	fill(dp[1], dp[1] + 100001, LLONG_MAX / 2);
  dp[0][0]=dp[1][0]= LLONG_MAX/2;
  q.push({0,{st,0}});
  while(!q.empty()){
    ll w,node,par;pll p;
    tie(w,p)=q.top();
    tie(node,par)=p;
    q.pop();
    if(!vs[node]){
      vs[node]=true;
      ds[node]+=w;
      dp[0][node]=min(du[node],dp[0][par]);
      dp[1][node]=min(dv[node],dp[1][par]);
      for(pll it:g[node]) q.push({w+it.se,{it.fi,node}});
    }
    else if(w==ds[node] and min(dp[0][par],du[node])+min(dv[node],dp[1][par])<=dp[1][node]+dp[0][node]){
      dp[0][node]=min(dp[0][par],du[node]);
      dp[1][node]=min(dv[node],dp[1][par]);
    }
  }
  ans=min(ans,dp[0][ed]+dp[1][ed]);
}
int main() 
{
  // freopen("PathLib.Inp","r",stdin);
  // freopen("PathLib.Out","w",stdout);
  cin>>n>>m>>s>>t>>u>>v;
  for(long i=0;i<m;i++){
    ll a,b,c;
    cin>>a>>b>>c;
    g[a].push_back({b,c});
    g[b].push_back({a,c});
  }
  djk1(u,du); djk1(v,dv);
  ans=du[v];
  djk2(s,t); djk2(t,s);
  cout<<ans;
    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...