Submission #1324029

#TimeUsernameProblemLanguageResultExecution timeMemory
1324029sh_qaxxorov_571Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
287 ms23024 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 cost;
};

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& edge : adj[u]) {
            if (dist[u] + edge.cost < dist[edge.to]) {
                dist[edge.to] = dist[u] + edge.cost;
                pq.push({dist[edge.to], edge.to});
            }
        }
    }
}

int main() {
    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 dan T ga eng qisqa yo'llar grafigini (DAG) qurish va DP
    vector<int> in_degree(N + 1, 0);
    vector<vector<int>> dag_adj(N + 1);
    for (int u = 1; u <= N; u++) {
        for (auto& edge : adj[u]) {
            if (distS[u] + edge.cost + distT[edge.to] == distS[T]) {
                dag_adj[u].push_back(edge.to);
                in_degree[edge.to]++;
            }
        }
    }

    // Topologik saralash va DP
    queue<int> q;
    for (int i = 1; i <= N; i++) if (in_degree[i] == 0) q.push(i);

    vector<ll> dpU = distU, dpV = distV;
    ll ans = distU[V];

    while (!q.empty()) {
        int u = q.front(); q.pop();
        ans = min(ans, dpU[u] + distV[u]);
        ans = min(ans, dpV[u] + distU[u]);

        for (int v : dag_adj[u]) {
            dpU[v] = min(dpU[v], dpU[u]);
            dpV[v] = min(dpV[v], dpV[u]);
            if (--in_degree[v] == 0) q.push(v);
        }
    }

    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...