Submission #1342815

#TimeUsernameProblemLanguageResultExecution timeMemory
1342815tamir1Commuter Pass (JOI18_commuter_pass)C++17
15 / 100
2094 ms20748 KiB
#include <bits/stdc++.h>
using namespace std;


#define int long long
#define ff first 
#define ss second
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define rall(a) (a).rbegin(),(a).rend()
#define pb push_back



vector<vector<pair<int, int>>> adj;
int ans;
int s, t;
vector<int> dis;
vector<int> dis2;
vector<int> dis3;


void dfs(int node, int mn1, int mn2) {
    ans = min(ans, mn1 + mn2);
    if(node == s) return;
    for(auto &[a, b] : adj[node]) {
        if(dis[a] + b == dis[node]) {
            dfs(a, min(mn1, dis2[a]), min(mn2, dis3[a]));
        }
    }
}

void solve() {
    
    int n, m;
    cin >> n >> m;
    int u, v;
    adj.assign(n + 1, {});
    dis.assign(n + 1, -1);
    dis2.assign(n + 1, -1);
    dis3.assign(n + 1, -1);
    cin >> s >> t >> u >> v;
    for(int i = 1; i <= m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        adj[a].pb({b, c});
        adj[b].pb({a, c});
    }



    priority_queue<pair<int, int>> q;
    queue<int> p;

    q.push({0, s});
    while(!q.empty()) {
        int u = q.top().ss;
        int t = q.top().ff;
        q.pop();
        if(dis[u] != -1) continue;
        dis[u] = -t;
        for(auto &[a, b] : adj[u]) {
            if(dis[a] == -1) q.push({t - b, a});
        }
    }

    q.push({0, v});
    while(!q.empty()) {
        int u = q.top().ss;
        int t = q.top().ff;
        q.pop();
        if(dis2[u] != -1) continue;
        dis2[u] = -t;
        for(auto &[a, b] : adj[u]) {
            if(dis2[a] == -1) q.push({t - b, a});
        }
    }

    q.push({0, u});
    while(!q.empty()) {
        int u = q.top().ss;
        int t = q.top().ff;
        q.pop();
        if(dis3[u] != -1) continue;
        dis3[u] = -t;
        for(auto &[a, b] : adj[u]) {
            if(dis3[a] == -1) q.push({t - b, a});
        }
    }
    ans = dis2[u];
    dfs(t, dis2[t], dis3[t]);
    cout << ans << "\n";
}   


signed main() {
    ios_base::sync_with_stdio(0);cin.tie(0);


    int t = 1;
    // cin >> t;
    while(t--) solve();
    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...