Submission #1253240

#TimeUsernameProblemLanguageResultExecution timeMemory
1253240escobrandCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
248 ms19108 KiB
#include <bits/stdc++.h>

using namespace std;
#define all(v) v.begin(),v.end()
#define pb push_back
#define ll long long
#define ld long double
#define fi first
#define se second
#define mk make_pair
typedef pair<ll,ll> pii;
int i,n,t,m,u,v;
const int maxn = 1e5 +10;
vector<pii> adj[maxn];
int source[4];
priority_queue<pii,vector<pii>,greater<>>q;
ll d[4][maxn];
ll mn[4][maxn],w,ans;

void dik(int id)
{
  for(i = 1;i<=n;i++)d[id][i] = LLONG_MAX;
  i = source[id];
  d[id][i] = 0;
  q.push({0,i});
  while(q.size())
  {
    i = q.top().se;
    w = q.top().fi;
    q.pop();
    // cout<<id<<' '<<i<<'\n';
    if(w != d[id][i])continue;
    for(pii k : adj[i])
    {
      if(d[id][k.fi]>w + k.se)
      {
        d[id][k.fi]=w + k.se;
        q.push({d[id][k.fi],k.fi});
      }
    }
  }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n>>m;
    for(i = 0;i<4;i++)cin>>source[i];
    while(m--)
    {
      cin>>u>>v>>w;
      adj[u].pb({v,w});
      adj[v].pb({u,w});
    }
    for(int i = 1;i<4;i++)dik(i);
    ans = d[2][source[3]];
    for(i = 1;i<=n;i++)
    {
      d[0][i] = mn[2][i] = mn[3][i] = LLONG_MAX;
    }
    i = source[0];
    d[0][i] = 0;
    q.push({0,i});
    while(q.size())
    {
      i = q.top().se;
      w = q.top().fi;
      q.pop();
      if(w != d[0][i])continue;
      mn[2][i] = min(mn[2][i],d[2][i]);
      mn[3][i] = min(mn[3][i],d[3][i]);
      
      if(d[1][i] + w == d[1][source[0]])
      {
        ans = min({ans,mn[2][i] + d[3][i],mn[3][i] + d[2][i]});
      }
      
      for(pii k : adj[i])
      {
        if(d[0][k.fi]>w + k.se)
        {
          d[0][k.fi]= w + k.se;
          q.push({d[0][k.fi],k.fi});
          mn[2][k.fi] = mn[2][i];
          mn[3][k.fi] = mn[3][i];
        }
        else if(d[0][k.fi]==w + k.se)
        {
          mn[2][k.fi] = min(mn[2][k.fi],mn[2][i]);
          mn[3][k.fi] = min(mn[3][k.fi],mn[3][i]);
        }
      }
    }
    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...