Submission #1325613

#TimeUsernameProblemLanguageResultExecution timeMemory
1325613kenkunkinCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
207 ms22808 KiB
#include <bits/stdc++.h>

using namespace std;

void Init()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

typedef long long ll;
typedef pair<ll,ll> pii;

int n,m;
const int maxn=1e5+5;
int S,T,U,V;

vector<pii> g[maxn];
vector<int> dag[maxn];

ll ds[maxn],dt[maxn],du[maxn],dv[maxn];
ll best[maxn];
bool onPath[maxn];

void Input()
{
    cin>>n>>m;
    cin>>S>>T>>U>>V;

    for (int i=1;i<=m;i++)
    {
        ll u,v,w;
        cin>>u>>v>>w;
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
}

void dijk(ll d[],int s)
{
    priority_queue<pii,vector<pii>,greater<pii>> pq;

    for (int i=1;i<=n;i++)
        d[i]=(ll)4e18;

    d[s]=0;
    pq.push({0,s});

    while (!pq.empty())
    {
        ll dist=pq.top().first;
        int u=pq.top().second;
        pq.pop();

        if (dist>d[u]) continue;

        for (int i=0;i<g[u].size();i++)
        {
            int v=g[u][i].first;
            ll w=g[u][i].second;

            if (d[v]>dist+w)
            {
                d[v]=dist+w;
                pq.push({d[v],v});
            }
        }
    }
}

bool cmp(int a,int b)
{
    return ds[a]<ds[b];
}

void Bai()
{
    dijk(ds,S);
    dijk(dt,T);
    dijk(du,U);
    dijk(dv,V);

    for (int u=1;u<=n;u++)
    {
        for (int i=0;i<g[u].size();i++)
        {
            int v=g[u][i].first;
            ll w=g[u][i].second;

            if (ds[u]+w==ds[v])
                dag[u].push_back(v);
        }
    }

    for (int i=1;i<=n;i++)
    {
        if (ds[i]+dt[i]==ds[T])
            onPath[i]=1;
        else
            onPath[i]=0;
    }

    vector<int> ord;
    for (int i=1;i<=n;i++)
        ord.push_back(i);

    sort(ord.begin(),ord.end(),cmp);

    for (int i=1;i<=n;i++)
        best[i]=(ll)4e18;

    for (int i=0;i<n;i++)
    {
        int u=ord[i];

        if (onPath[u])
            best[u]=min(best[u],du[u]);

        for (int j=0;j<dag[u].size();j++)
        {
            int v=dag[u][j];
            best[v]=min(best[v],best[u]);
        }
    }

    ll ans=du[V];

    for (int i=1;i<=n;i++)
        if (onPath[i])
            ans=min(ans,best[i]+dv[i]);

    cout<<ans;
}

int main()
{
    Init();
    Input();
    Bai();
    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...