Submission #1217014

#TimeUsernameProblemLanguageResultExecution timeMemory
1217014escobrandCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
279 ms19448 KiB
#include <bits/stdc++.h>

using namespace std;
#define all(v) v.begin(),v.end()
#define eb push_back
#define ll long long 
#define fi first
#define se second
int t,n,i,j,m,v,w,u;
const int maxn = 1e5 + 10;
const ll inf = 1e15;
typedef pair<ll,ll> pii;
vector<pii>adj[maxn];
int pos[4],c[maxn];
ll from[4][maxn],min2[maxn],min3[maxn],ans;

priority_queue<pii,vector<pii>,greater<>>q;

void dik(int id)
{
  int s = pos[id];
  for(int i = 1;i<=n;i++)from[id][i] = inf;
  from[id][s] = 0;
  q.push({0,s});
  ++t;
  while(q.size())
  {
    s = q.top().se;
    ll val = q.top().fi;
    q.pop();
    if(c[s] == t)continue;
    c[s] = t;
    for(auto k : adj[s])
    {
      if(from[id][k.fi] > val + k.se)
      {
        from[id][k.fi] = val + k.se;
        q.push({val + k.se,k.fi});
      }
    }
  }
}

void solve()
{
  int s = pos[0];
  for(int i = 1;i<=n;i++)from[0][i] = min2[i] = min3[i] = inf;
  from[0][s] = 0;
  q.push({0,s});
  ++t;
  while(q.size())
  {
    int i = q.top().se;
    ll val = q.top().fi;
    q.pop();
    if(c[i] == t)continue;
    c[i] = t;
    min2[i] = min(min2[i],from[2][i]);
    min3[i] = min(min3[i],from[3][i]);
    if(from[1][i] + val == from[1][pos[0]])
    {
      // cout<<i<<' ';
      ans = min(ans,min(min2[i] + from[3][i], min3[i] + from[2][i]));
    }
    for(auto k : adj[i])
    {
      if(from[0][k.fi] > val + k.se)
      {
        from[0][k.fi] = val + k.se;
        q.push({val + k.se,k.fi});
        min2[k.fi] = min2[i];
        min3[k.fi] = min3[i];
      }
      else if(from[0][k.fi] == val + k.se)
      {
        min2[k.fi] = min(min2[i],min2[k.fi]);
        min3[k.fi] = min(min3[i],min3[k.fi]);
      }
    }
  }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin>>n>>m;
    for(i = 0;i<4;i++)cin>>pos[i];
    
    while(m--)
    {
      cin>>u>>v>>w;
      adj[u].eb({v,w});
      adj[v].eb({u,w});
    }
    
    for(i = 1;i<4;i++)
    {
      dik(i);
    }
    
    ans = from[2][pos[3]];
    
    solve();
    // cout<<from[0][pos[1]];
    
    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...