Submission #1218027

#TimeUsernameProblemLanguageResultExecution timeMemory
1218027teslerphamCommuter Pass (JOI18_commuter_pass)C++20
31 / 100
239 ms35600 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define el '\n'
#define int long long
using ll = long long;
using pii = pair<int,int>;
using vi = vector<int>;
using vll = vector<ll>;

const int INF = 1e18 + 7;
const int MOD = 1e9 + 7;

void fastIO() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

struct Edge { int v; ll w; };

signed main(){
    fastIO();
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;

    int S, T, U, V;
    cin >> S >> T >> U >> V;

    vector<tuple<int,int,ll>> edges;
    edges.reserve(M);
    vector<vector<Edge>> adj(N+1);
    for(int i = 0; i < M; i++){
        int A, B; ll C;
        cin >> A >> B >> C;
        edges.emplace_back(A,B,C);
        adj[A].push_back({B,C});
        adj[B].push_back({A,C});
    }

    auto dijkstra = [&](int src){
        vector<ll> dist(N+1, INF);
        priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<>> pq;
        dist[src] = 0;
        pq.emplace(0, src);
        while(!pq.empty()){
            auto [du,u] = pq.top(); pq.pop();
            if(du > dist[u]) continue;
            for(auto &e: adj[u]){
                int v = e.v; ll w = e.w;
                if(dist[v] > du + w){
                    dist[v] = du + w;
                    pq.emplace(dist[v], v);
                }
            }
        }
        return dist;
    };

    // 1) Dijkstra từ S và T
    auto distS = dijkstra(S);
    auto distT = dijkstra(T);
    ll D = distS[T];

    // 2) đánh dấu “free” cạnh
    // build new graph with cost'=0 for free, else original
    vector<vector<Edge>> adj2(N+1);
    for(auto &ed: edges){
        int u,v; ll w;
        tie(u,v,w) = ed;
        bool free_edge = 
           (distS[u] + w + distT[v] == D) ||
           (distS[v] + w + distT[u] == D);
        ll w2 = free_edge ? 0 : w;
        adj2[u].push_back({v,w2});
        adj2[v].push_back({u,w2});
    }

    // 3) Dijkstra từ U trên đồ thị mới
    vector<ll> distU(N+1, INF);
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<>> pq;
    distU[U] = 0;
    pq.emplace(0, U);
    while(!pq.empty()){
        auto [du,u] = pq.top(); pq.pop();
        if(du > distU[u]) continue;
        for(auto &e: adj2[u]){
            int v = e.v; ll w = e.w;
            if(distU[v] > du + w){
                distU[v] = du + w;
                pq.emplace(distU[v], v);
            }
        }
    }

    ll ans = distU[V];
    cout << ans << el;
    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...