Submission #716986

#TimeUsernameProblemLanguageResultExecution timeMemory
716986ovidiush11Commuter Pass (JOI18_commuter_pass)C++14
31 / 100
900 ms100536 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ff first
#define ss second

const ll N = 1e5 + 7;

struct node{
    queue<ll> from;
    ll len = 1e18;
};
vector<vector<pair<ll,ll>>> a;
node b[N];
ll dis[N],fdis[N];

void dijsktra1(ll start)
{
    set<pair<ll,pair<ll,ll>>> s;
    s.insert({0,{start,start}});
    while(!s.empty())
    {
        pair<ll,pair<ll,ll>> v = *s.begin();
        s.erase(s.begin());
        if(v.ff > b[v.ss.ff].len)continue;
        dis[v.ss.ff] = max(dis[v.ss.ff],dis[v.ss.ss] + 1);
        if(v.ff == b[v.ss.ff].len)
        {
            b[v.ss.ff].from.push(v.ss.ss);
            continue;
        }
        b[v.ss.ff].len = v.ff;
        b[v.ss.ff].from = queue<ll>();
        b[v.ss.ff].from.push(v.ss.ss);
        for(auto x : a[v.ss.ff])s.insert({b[v.ss.ff].len + x.ff,{x.ss,v.ss.ff}});
    }
    b[start].from.pop();
    return;
}


void correct(ll start)
{
    queue<ll> q;
    q.push(start);
    while(!q.empty())
    {
        ll v = q.front();
        q.pop();
        if(fdis[v] != -1)continue;
        fdis[v] = dis[v];
        while(!b[v].from.empty())
        {
            q.push(b[v].from.front());
            b[v].from.pop();
        }
    }
    return ;
}

ll st[N],dis2[N];

void dijsktra2(ll start)
{
    set<pair<ll,pair<ll,ll>>> s;
    s.insert({0,{start,-1}});
    while(!s.empty())
    {
        pair<ll,pair<ll,ll>> v = *s.begin();
        s.erase(s.begin());
        if(v.ff > dis2[v.ss.ff])continue;
        if(st[v.ss.ff] == 2)continue;
        if(st[v.ss.ff] == 1 && v.ss.ss > -1)continue;
        if(v.ss.ss == -1)st[v.ss.ff] = 2;
        else st[v.ss.ff] = 1;
        dis2[v.ss.ff] = v.ff;
        for(auto x : a[v.ss.ff])
        {
            if(v.ss.ss == -1)
            {
                s.insert({dis2[v.ss.ff] + x.ff,{x.ss,-1}});
                if(fdis[v.ss.ff] < fdis[x.ss] && fdis[x.ss] != -1 && fdis[v.ss.ff] != -1)s.insert({dis2[v.ss.ff],{x.ss,0}});
                else if(fdis[v.ss.ff] != -1 && fdis[x.ss] != -1)s.insert({dis2[v.ss.ff],{x.ss,1}});
            }
            else if(v.ss.ss == 0)
            {
                if(fdis[v.ss.ff] < fdis[x.ss] && fdis[v.ss.ff] != -1 && fdis[x.ss] != -1)s.insert({dis2[v.ss.ff],{x.ss,0}});
                s.insert({dis2[v.ss.ff] + x.ff,{x.ss,2}});
            }
            else if(v.ss.ss == 1)
            {
                if(fdis[v.ss.ff] > fdis[x.ss] && fdis[v.ss.ff] != -1 && fdis[x.ss] != -1)s.insert({dis2[v.ss.ff],{x.ss,1}});
                else s.insert({dis2[v.ss.ff] + x.ff,{x.ss,2}});
            }
            else s.insert({dis2[v.ss.ff] + x.ff,{x.ss,2}});
        }
    }
    return ;
}

int main()
{
    ll n,m,s,t,u,v;
    cin>>n>>m;
    cin>>s>>t;
    cin>>u>>v;
    s--;t--;u--;v--;
    a.resize(n);
    for(ll i = 0;i < n;i++)fdis[i] = -1;
    for(ll i = 0;i < n;i++)dis2[i] = 1e18;
    for(ll i = 0;i < m;i++)
    {
        ll x,y,z;
        cin>>x>>y>>z;x--;y--;
        a[x].push_back({z,y});
        a[y].push_back({z,x});
    }
    dijsktra1(s);
    correct(t);
    //cout<<b[t].len<<" ";
    dijsktra2(u);
    cout<<dis2[v]<<" ";
}
/*
6 7
2 4
2 4
1 2 1
1 6 2
2 6 3
2 5 1
2 3 4
3 4 2
6 4 3
*/

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...