Submission #434293

#TimeUsernameProblemLanguageResultExecution timeMemory
434293JovanK26Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
729 ms27436 KiB
#include <bits/stdc++.h>

using namespace std;
long long n,m,s,t,u,v;
vector< pair<long long,long long> > adj[100001];
long long ds[100001];
long long dt[100001];
long long du[100001];
long long dv[100001];
void dijkstra1(long long start=s)
{
    for(long long i=0;i<n;i++)
    {
        ds[i]=1000000000000000000;
    }
    ds[start]=0;
    set< pair<long long,long long> > st;
    st.insert({ds[start],start});
    while(!st.empty())
    {
        long long cur=st.begin()->second;
        st.erase(st.begin());
        for(auto p : adj[cur])
        {
            long long node=p.first;
            long long len=p.second;
            if(ds[cur]+len<ds[node])
            {
               st.erase({ds[node],node});
               ds[node]=ds[cur]+len;
               st.insert({ds[node],node});
            }
        }
    }
}
void dijkstra2(long long start=t)
{
    for(long long i=0;i<n;i++)
    {
        dt[i]=1000000000000000000;
    }
    dt[start]=0;
    set< pair<long long,long long> > st;
    st.insert({dt[start],start});
    while(!st.empty())
    {
        long long cur=st.begin()->second;
        st.erase(st.begin());
        for(auto p : adj[cur])
        {
            long long node=p.first;
            long long len=p.second;
            if(dt[cur]+len<dt[node])
            {
               st.erase({dt[node],node});
               dt[node]=dt[cur]+len;
               st.insert({dt[node],node});
            }
        }
    }
}
void dijkstra3(long long start=u)
{
    for(long long i=0;i<n;i++)
    {
        du[i]=1000000000000000000;
    }
    du[start]=0;
    set< pair<long long,long long> > st;
    st.insert({du[start],start});
    while(!st.empty())
    {
        long long cur=st.begin()->second;
        st.erase(st.begin());
        for(auto p : adj[cur])
        {
            long long node=p.first;
            long long len=p.second;
            if(du[cur]+len<du[node])
            {
               st.erase({du[node],node});
               du[node]=du[cur]+len;
               st.insert({du[node],node});
            }
        }
    }
}
void dijkstra4(long long start=v)
{
    for(long long i=0;i<n;i++)
    {
        dv[i]=1000000000000000000;
    }
    dv[start]=0;
    set< pair<long long,long long> > st;
    st.insert({dv[start],start});
    while(!st.empty())
    {
        long long cur=st.begin()->second;
        st.erase(st.begin());
        for(auto p : adj[cur])
        {
            long long node=p.first;
            long long len=p.second;
            if(dv[cur]+len<dv[node])
            {
               st.erase({dv[node],node});
               dv[node]=dv[cur]+len;
               st.insert({dv[node],node});
            }
        }
    }
}
long long f[100001];
long long rez=1000000000000000000;
long long dfs(long long cur,bool is)
{
    if(f[cur]==-1)
    {
        if(ds[cur]+dt[cur]==ds[t])
        {
            f[cur]=dv[cur];
            for(auto p : adj[cur])
            {
                long long node=p.first;
                long long len=p.second;
                if(is && ds[cur]+len==ds[node])
                {
                    f[cur]=min(f[cur],dfs(node,is));
                }
                else if(!is && dt[cur]+len==dt[node])
                {
                    f[cur]=min(f[cur],dfs(node,is));
                }
                rez=min(rez,du[cur]+f[cur]);
            }
        }
        else
        {
            f[cur]=1000000000000000000;
        }
    }
    return f[cur];
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> s >> t >> u >> v;
    s--;
    t--;
    u--;
    v--;
    long long a,b,c;
    for(long long i=0;i<m;i++)
    {
        cin >> a >> b >> c;
        a--;
        b--;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
    }
    dijkstra1();
    dijkstra2();
    dijkstra3();
    dijkstra4();
    rez=du[v];
    memset(f,-1,8*n);
    dfs(s,1);
    memset(f,-1,8*n);
    dfs(t,0);
    cout << rez;
    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...