Submission #1319263

#TimeUsernameProblemLanguageResultExecution timeMemory
1319263ninstroyerCommuter Pass (JOI18_commuter_pass)C++20
31 / 100
289 ms20236 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long

const ll nx = 1e5+5, inf = 4e18;

ll n,m,s,t,x,y,res=inf,mns[nx],mnt[nx],mnx[nx],mny[nx],vs[nx],dp[nx][2];
vector<pair<int,ll>> adj[nx];

void dijkstra(int st, ll mn[])
{
    mn[st] = 0;
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
    pq.push({0,st});
    while(!pq.empty())
    {
        auto [d, u] = pq.top();
        pq.pop();
        if(d > mn[u]) continue;
        for(auto [v,w] : adj[u])
        {
            if(d+w < mn[v])
            {
                mn[v] = d+w;
                pq.push({mn[v],v});
            }
        }
    }
}

void dfs(int u)
{
    if(vs[u]) return;
    vs[u] = 1; 
    dp[u][0] = inf;
    dp[u][1] = inf;
    for(auto [v, w] : adj[u])
    {
        if(mns[v] + mnt[v] > mns[t] || mns[v] < mns[u]) continue;
        dfs(v);
        dp[u][0] = min(dp[u][0],dp[v][0]);
        dp[u][1] = min(dp[u][1],dp[v][1]);
    }
    dp[u][0] = min(dp[u][0], mnx[u]);
    dp[u][1] = min(dp[u][1], mny[u]);
    res = min({res,dp[u][0]+dp[u][1]});
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>m>>s>>t>>x>>y;
    for(int i = 1; i <= n; i++) mns[i] = mnt[i] = mnx[i] = mny[i] = inf;
    for(int i = 1; i <= m; i++)
    {
        int u,v,w; cin>>u>>v>>w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
    }
    dijkstra(s, mns);
    dijkstra(t, mnt);
    dijkstra(x, mnx);
    dijkstra(y, mny);
    dfs(s);
    cout<<min(res,mnx[y]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...