Submission #1325615

#TimeUsernameProblemLanguageResultExecution timeMemory
1325615kenkunkinCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
171 ms23160 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],du[maxn],dv[maxn];
ll dp[maxn][4];

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(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);
        }

    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++)
    {
        dp[i][0]=0;
        dp[i][1]=du[i];
        dp[i][2]=dv[i];
        dp[i][3]=du[i]+dv[i];
    }

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

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

            for (int mask=0;mask<4;mask++)
                dp[v][mask]=min(dp[v][mask],dp[u][mask]);
        }
    }

    ll ans=du[V];

    for (int i=1;i<=n;i++)
        ans=min(ans,dp[i][3]);

    cout<<ans<<"\n";
}

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...