Submission #1343638

#TimeUsernameProblemLanguageResultExecution timeMemory
1343638Born_To_LaughCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
194 ms21904 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 1e18 + 7;

const int maxn = 1e5 + 10;
int n, m;
int s, t, u, v;
vector<pair<int, int>> adj[maxn];
vector<int> adjdag[maxn];
int vis[maxn];
vector<int> topo;

//dijkstra
vector<ll> dijkstra(int a){
    vector<ll> dist(n + 1, INF);
    dist[a] = 0;
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
    pq.push({0, a});
    while(!pq.empty()){
        int x = pq.top().se;
        ll d = pq.top().fi;
        pq.pop();
        if(d > dist[x]) continue;
        for(auto &elm: adj[x]){
            if(dist[elm.fi] > d + elm.se){
                dist[elm.fi] = d + elm.se;
                pq.push({dist[elm.fi], elm.fi});
            }
        }
    }
    return dist;
}
//dfs
void dfs(int a){
    vis[a] = 1;
    for(auto &elm: adjdag[a]){
        if(vis[elm]) continue;
        dfs(elm);
    }
    topo.push_back(a);
}

void solve(){
    cin >> n >> m;
    cin >> s >> t >> u >> v;
    for(int i=1; i<=m; ++i){
        int a, b, c;cin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    vector<ll> distS = dijkstra(s);
    vector<ll> distT = dijkstra(t);
    vector<ll> distU = dijkstra(u);
    vector<ll> distV = dijkstra(v);

    for(int i=1; i<=n; ++i){
        for(auto &elm: adj[i]){
            if(distS[i] + elm.se + distT[elm.fi] == distS[t]){
                adjdag[i].push_back(elm.fi);
            }
        }
    }

    for(int i=1; i<=n; ++i) if(!vis[i]) dfs(i);

    vector<ll> dpU(n + 1, INF);
    vector<ll> dpV(n + 1, INF);

    ll ans = INF;
    
    for(auto &x: topo){
        dpU[x] = distU[x];
        dpV[x] = distV[x];
        for(auto &elm: adjdag[x]){
            dpU[x] = min(dpU[x], dpU[elm]);
            dpV[x] = min(dpV[x], dpV[elm]);
        }
        ans = min(ans, dpU[x] + distV[x]);
        ans = min(ans, dpV[x] + distU[x]);
    }
    cout << ans << '\n';
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    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...