Submission #1336628

#TimeUsernameProblemLanguageResultExecution timeMemory
1336628sh_qaxxorov_571Cities (BOI16_cities)C++20
100 / 100
1728 ms44744 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

const long long INF = 1e18;

struct Edge {
    int to;
    long long weight;
};

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

    int n, k, m;
    cin >> n >> k >> m;

    vector<int> important_cities(k);
    for (int i = 0; i < k; i++) {
        cin >> important_cities[i];
    }

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

    // dp[mask][i] - mask dagi muhim shaharlarni i shahri orqali 
    // bog'lashning minimal narxi
    vector<vector<long long>> dp(1 << k, vector<long long>(n + 1, INF));

    for (int i = 0; i < k; i++) {
        dp[1 << i][important_cities[i]] = 0;
    }

    for (int mask = 1; mask < (1 << k); mask++) {
        // 1. Kichik masklardan kattasini hosil qilish (Submask DP)
        for (int submask = (mask - 1) & mask; submask > 0; submask = (submask - 1) & mask) {
            for (int i = 1; i <= n; i++) {
                if (dp[submask][i] != INF && dp[mask ^ submask][i] != INF) {
                    dp[mask][i] = min(dp[mask][i], dp[submask][i] + dp[mask ^ submask][i]);
                }
            }
        }

        // 2. Bir xil mask ichida shaharlararo masofani optimallashtirish (Dijkstra)
        priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
        for (int i = 1; i <= n; i++) {
            if (dp[mask][i] != INF) {
                pq.push({dp[mask][i], i});
            }
        }

        while (!pq.empty()) {
            long long d = pq.top().first;
            int u = pq.top().second;
            pq.pop();

            if (d > dp[mask][u]) continue;

            for (auto &edge : adj[u]) {
                if (dp[mask][edge.to] > d + edge.weight) {
                    dp[mask][edge.to] = d + edge.weight;
                    pq.push({dp[mask][edge.to], edge.to});
                }
            }
        }
    }

    // Yakuniy javob: barcha k shaharlar bog'langan mask (1<<k - 1)
    long long ans = INF;
    for (int i = 1; i <= n; i++) {
        ans = min(ans, dp[(1 << k) - 1][i]);
    }

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...