제출 #1314596

#제출 시각아이디문제언어결과실행 시간메모리
131459612345678Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
2095 ms26132 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

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

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

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

void dfs(int u)
{
    // cout<<"u "<<u<<'\n';
    if (vs[u]) return;
    vs[u]=1;
    dp[u][0]=dp[u][1]=inf;
    for (auto [v, w]:adj[u])
    {
        if (mnt[v]+w!=mnt[u]) continue;
        dfs(v);
        dp[u][0]=min(dp[u][0], dp[v][0]);
        dp[u][1]=min(dp[u][1], dp[v][1]);
    }
    // cout<<"debug "<<u<<' '<<dp[u][0]<<' '<<dp[u][1]<<'\n';
    res=min({res, dp[u][0]+mny[u], dp[u][1]+mnx[u]});
    dp[u][0]=min(dp[u][0], mnx[u]);
    dp[u][1]=min(dp[u][1], mny[u]);
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m>>s>>t>>x>>y;
    for (int i=1; i<=m; i++) 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...