Submission #943344

# Submission time Handle Problem Language Result Execution time Memory
943344 2024-03-11T11:10:16 Z GrandTiger1729 Cities (BOI16_cities) C++17
52 / 100
1115 ms 21296 KB
#include <bits/stdc++.h>
using namespace std;

const long long INF = 1e18;
int main()
{
    cin.tie(0)->sync_with_stdio(0);
    int n, K, m;
    cin >> n >> K >> m;
    vector<int> a(K);
    for (int i = 0; i < K; i++)
    {
        cin >> a[i];
        a[i]--;
    }
    vector<vector<pair<int, int>>> g(n);
    for (int i = 0; i < m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        u--, v--;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
    }
    auto dijkstra = [&](int i)
    {
        priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> pq;
        pq.emplace(0, i);
        vector<long long> dis(n, INF);
        vector<bool> vis(n);
        while (pq.size())
        {
            auto [d, u] = pq.top();
            pq.pop();
            if (vis[u])
            {
                continue;
            }
            vis[u] = 1;
            dis[u] = d;
            for (auto &[v, w] : g[u])
            {
                if (dis[v] > dis[u] + w)
                {
                    dis[v] = dis[u] + w;
                    pq.emplace(dis[v], v);
                }
            }
        }
        return dis;
    };
    auto merge = [&](const vector<long long> &b, const vector<long long> &c) -> vector<long long>
    {
        priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> pq;
        for (int i = 0; i < n; i++)
        {
            pq.emplace(b[i] + c[i], i);
        }
        vector<long long> ret(n, INF);
        vector<bool> vis(n);
        while (pq.size())
        {
            auto [d, u] = pq.top();
            pq.pop();
            if (vis[u])
            {
                continue;
            }
            vis[u] = 1;
            ret[u] = d;
            for (auto &[v, w] : g[u])
            {
                if (ret[v] > ret[u] + w)
                {
                    ret[v] = ret[u] + w;
                    pq.emplace(ret[v], v);
                }
            }
        }
        return ret;
    };
    sort(a.begin(), a.end());
    vector<vector<long long>> dis(K);
    for (int i = 0; i < K; i++)
    {
        dis[i] = dijkstra(a[i]);
    }
    long long ans = INF;
    vector<int> ord(K);
    iota(ord.begin(), ord.end(), 0);
    vector<vector<bool>> vis(K, vector<bool>(K));
    do
    {
        if (vis[ord[0]][ord[1]])
        {
            continue;
        }
        vis[ord[0]][ord[1]] = vis[ord[1]][ord[0]] = 1;
        vector<long long> res = dis[ord[0]];
        for (int i = 1; i < K - 1; i++)
        {
            res = merge(res, dis[ord[i]]);
        }
        ans = min(ans, res[a[ord[K - 1]]]);
    }
    while (next_permutation(ord.begin(), ord.end() - 1));
    cout << ans << '\n';
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Incorrect 1 ms 344 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 243 ms 18484 KB Output is correct
2 Correct 232 ms 18548 KB Output is correct
3 Correct 105 ms 11224 KB Output is correct
4 Correct 44 ms 5104 KB Output is correct
5 Correct 139 ms 12256 KB Output is correct
6 Correct 43 ms 5028 KB Output is correct
7 Correct 2 ms 604 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 604 KB Output is correct
2 Correct 3 ms 604 KB Output is correct
3 Correct 2 ms 604 KB Output is correct
4 Correct 2 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 513 ms 21296 KB Output is correct
2 Correct 498 ms 19928 KB Output is correct
3 Correct 257 ms 13772 KB Output is correct
4 Correct 284 ms 12968 KB Output is correct
5 Correct 109 ms 7456 KB Output is correct
6 Correct 60 ms 6876 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1115 ms 21020 KB Output is correct
2 Incorrect 1041 ms 20488 KB Output isn't correct
3 Halted 0 ms 0 KB -