Submission #1226565

#TimeUsernameProblemLanguageResultExecution timeMemory
1226565wedonttalkanymoreCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
126 ms15304 KiB
#include <bits/stdc++.h>
#define pii pair<long long, long long>
#define fi first
#define se second
using namespace std;
using ll = long long;

const int N = 100005;
const ll INF = 1e18;

int n, m, S, T, U, V;
vector<pair<int,int>> adj[N];
ll dist_s[N], dist_t[N], dist_ans[N];
int a[N], b[N], c[N];
ll costOnPass[N];

void dijkstra(int src, ll *length) {
    for (int i = 1; i <= n; i++) length[i] = INF;
    length[src] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({0, src});
    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if (d > length[u]) continue;
        for (auto &ed : adj[u]) {
            int v = ed.fi, id = ed.se;
            ll w = c[id];
            if (length[v] > d + w) {
                length[v] = d + w;
                pq.push({length[v], v});
            }
        }
    }
}

void dijkstra1() {
    for (int i = 1; i <= n; i++) dist_ans[i] = INF;
    dist_ans[U] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({0, U});
    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if (d > dist_ans[u]) continue;
        for (auto &ed : adj[u]) {
            int v = ed.fi, id = ed.se;
            ll w = costOnPass[id];
            if (dist_ans[v] > d + w) {
                dist_ans[v] = d + w;
                pq.push({dist_ans[v], v});
            }
        }
    }
}

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

    cin >> n >> m >> S >> T >> U >> V;
    for (int i = 1; i <= m; i++){
        cin >> a[i] >> b[i] >> c[i];
        adj[a[i]].push_back({b[i], i});
        adj[b[i]].push_back({a[i], i});
    }

    dijkstra(S, dist_s);
    dijkstra(T, dist_t);

    ll D = dist_s[T];
    for (int i = 1; i <= m; i++){
        // nếu (a→b) hoặc (b→a) nằm trên 1 đường ngắn nhất S→T
        if ((dist_s[a[i]] + c[i] + dist_t[b[i]] == D) ||
            (dist_s[b[i]] + c[i] + dist_t[a[i]] == D)) {
            costOnPass[i] = 0;
        } else {
            costOnPass[i] = c[i];
        }
    }

    dijkstra1();
    cout << dist_ans[V] << "\n";
    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...