Submission #1310765

#TimeUsernameProblemLanguageResultExecution timeMemory
1310765syanvuCommuter Pass (JOI18_commuter_pass)C++20
31 / 100
572 ms36132 KiB
// #pragma optimize ("g",on)
// #pragma GCC optimize ("inline")
// #pragma GCC optimize ("Ofast")
// #pragma GCC optimize ("unroll-loops")
// #pragma GCC optimize ("03")
#include <bits/stdc++.h>

#define pb push_back
#define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
#define int long long
#define all(v) v.begin(),v.end()
using namespace std;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

const int N = 3e5 + 1, inf = 1e15, mod = 998244353;

vector<array<int, 3>> g[N];
int used[N], dv[N], du[N];
vector<vector<int>> p;
vector<array<int, 3>> e(N);
int ans = inf;

void dfs(int v, int mnu, int mnv){
    mnu = min(mnu, du[v]);
    mnv = min(mnv, dv[v]);
    ans = min(ans, mnu + mnv);
    used[v]++;
    for(int to : p[v]){
        if(used[to] > 100) continue;
        dfs(to, mnu, mnv);
    }
}

void solve(){
    int n, m;
    cin >> n >> m;
    p.resize(n + 1);
    int s, t;
    cin >> s >> t;
    int u, v;
    cin >> u >> v;
    for(int i = 1; i <= m; i++){
        int u, v, w;
        cin >> u >> v >> w;
        e[i] = {u, v, w};
        g[u].push_back({v, w, i});
        g[v].push_back({u, w, i});
    }
    for(int i = 1; i <= n; i++) du[i] = dv[i] = inf;
    vector<int> dist(n + 1, inf);
    priority_queue<pair<int, int>> q;
    q.push({0, t});
    dist[t] = 0;
    while(q.size()){
        auto [musor, v] = q.top();
        q.pop();
        musor = -musor;
        if(musor != dist[v]) continue;
        for(auto [to, w, id] : g[v]){
            if(dist[to] == dist[v] + w) p[to].push_back(v);
            else if(dist[to] > dist[v] + w){
                p[to].clear();
                p[to].push_back(v);
                dist[to] = dist[v] + w;
                q.push({-dist[to], to});
            }
        }
    }
    q.push({0, u});
    du[u] = 0;
    while(q.size()){
        auto [musor, v] = q.top();
        q.pop();
        musor = -musor;
        if(musor != du[v]) continue;
        for(auto [to, w, id] : g[v]){
            if(du[to] > du[v] + w){
                du[to] = du[v] + w;
                q.push({-du[to], to});
            }
        }
    }
    q.push({0, v});
    dv[v] = 0;
    while(q.size()){
        auto [musor, v] = q.top();
        q.pop();
        musor = -musor;
        if(musor != dv[v]) continue;
        for(auto [to, w, id] : g[v]){
            if(dv[to] > dv[v] + w){
                dv[to] = dv[v] + w;
                q.push({-dv[to], to});
            }
        }
    }
    ans = du[v];
    dfs(s, inf, inf);
    for(int i = 1; i <= n; i++){
        p[i].clear();
        used[i] = 0;
        dist[i] = inf;
    }
    q.push({0, s});
    dist[s] = 0;
    while(q.size()){
        auto [musor, v] = q.top();
        q.pop();
        musor = -musor;
        if(musor != dist[v]) continue;
        for(auto [to, w, id] : g[v]){
            if(dist[to] == dist[v] + w) p[to].push_back(v);
            else if(dist[to] > dist[v] + w){
                p[to].clear();
                p[to].push_back(v);
                dist[to] = dist[v] + w;
                q.push({-dist[to], to});
            }
        }
    }
    dfs(t, inf, inf);
    cout << ans;
}

signed main(){
    SS
    // freopen("trains.in", "r", stdin);
    // freopen("trains.out", "w", stdout);

    int t = 1;
    // cin >> t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...