Submission #928588

#TimeUsernameProblemLanguageResultExecution timeMemory
928588AlphaMale06Commuter Pass (JOI18_commuter_pass)C++17
15 / 100
2035 ms25096 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define F first
#define S second

const int N = 1e5+5;
const int inf = 1e16;

vector<pair<int, int>> adj[N];
int dist[N][4];
bool mark[N];
int dp[N][2];
int sp;
int ans;
vector<int> dag[N];

void dijkstra(int s, int t){
    for(int i=0; i< N; i++){
        mark[i]=0;
        dist[i][t]=inf;
    }
    dist[s][t]=0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, s});
    while(pq.size()){
        auto p = pq.top();
        pq.pop();
        if(mark[p.S] || dist[p.S][t]<p.F)continue;
        mark[p.S]=1;
        for(auto to : adj[p.S]){
            if(!mark[to.F] && to.S+dist[p.S][t]<dist[to.F][t]){
                dist[to.F][t]=to.S+dist[p.S][t];
                pq.push({dist[to.F][t], to.F});
            }
        }
    }
}

void dfs(int v, int p){
    dp[v][0]=min(dp[p][0], dist[v][2]);
    dp[v][1]=min(dp[p][1], dist[v][3]);
    ans=min(ans, dp[v][0]+dp[v][1]);
    for(int to : dag[v]){
        if(to!=p){
            dfs(to, v);
        }
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    for(int i=0; i< m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        adj[a].pb({b, c});
        adj[b].pb({a, c});
    }
    dijkstra(s, 0);
    dijkstra(t, 1);
    dijkstra(u, 2);
    dijkstra(v, 3);
    sp=dist[s][1];
    ans=dist[v][2];
    dp[0][0]=inf;
    dp[0][1]=inf;
    for(int i=1; i<=n; i++){
        for(auto to : adj[i]){
            if(dist[i][0]+dist[to.F][1]+to.S==sp)dag[i].pb(to.F);
        }
    }
    dfs(s, 0);
    for(int i=1; i<=n; i++)dag[i].clear();
    for(int i=1; i<=n; i++){
        for(auto to : adj[i]){
            if(dist[i][1]+dist[to.F][0]+to.S==sp)dag[i].pb(to.F);
        }
    }
    dfs(t, 0);
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...