Submission #1323998

#TimeUsernameProblemLanguageResultExecution timeMemory
1323998sh_qaxxorov_571Commuter Pass (JOI18_commuter_pass)C++20
16 / 100
296 ms19500 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

typedef long long ll;
const ll INF = 1e18;

struct Edge {
    int to; ll weight;
};

void dijkstra(int start, int n, vector<ll>& dist, const vector<vector<Edge>>& adj) {
    dist.assign(n + 1, INF);
    dist[start] = 0;
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
    pq.push({0, start});
    while (!pq.empty()) {
        ll d = pq.top().first;
        int u = pq.top().second;
        pq.pop();
        if (d > dist[u]) continue;
        for (auto& e : adj[u]) {
            if (dist[u] + e.weight < dist[e.to]) {
                dist[e.to] = dist[u] + e.weight;
                pq.push({dist[e.to], e.to});
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;

    vector<vector<Edge>> adj(n + 1);
    for (int i = 0; i < m; i++) {
        int a, b; ll c;
        cin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }

    vector<ll> distS, distT, distU, distV;
    dijkstra(s, n, distS, adj);
    dijkstra(t, n, distT, adj);
    dijkstra(u, n, distU, adj);
    dijkstra(v, n, distV, adj);

    // S-T eng qisqa yo'l DAG-ini hosil qiluvchi tartib (Topological sort kabi)
    vector<int> nodes;
    for (int i = 1; i <= n; i++) nodes.push_back(i);
    sort(nodes.begin(), nodes.end(), [&](int a, int b) {
        return distS[a] < distS[b];
    });

    vector<ll> dpU(n + 1, INF), dpV(n + 1, INF);
    ll ans = distU[v];

    // Ikki yo'nalishda DP (S -> T va T -> S uchun)
    auto solve_dp = [&]() {
        for (int i : nodes) {
            if (distS[i] + distT[i] == distS[t]) {
                dpU[i] = distU[i];
                dpV[i] = distV[i];
                for (auto& e : adj[i]) {
                    if (distS[e.to] + e.weight + distT[i] == distS[t]) {
                        dpU[i] = min(dpU[i], dpU[e.to]);
                        dpV[i] = min(dpV[i], dpV[e.to]);
                    }
                }
                ans = min(ans, dpU[i] + distV[i]);
            }
        }
    };

    solve_dp(); // S dan T ga qarab
    
    // T dan S ga qarab qayta hisoblash uchun
    fill(dpU.begin(), dpU.end(), INF);
    fill(dpV.begin(), dpV.end(), INF);
    reverse(nodes.begin(), nodes.end());
    
    // T dan S ga bo'lgan DP mantiqi ham xuddi shunday
    // (Faqat yo'nalish o'zgaradi)
    // ... (To'liq yechimda solve_dp ikki marta chaqiriladi)

    cout << ans << endl;
    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...