답안 #943339

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
943339 2024-03-11T11:06:58 Z GrandTiger1729 Cities (BOI16_cities) C++17
14 / 100
347 ms 21064 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(a.begin(), a.end() - 1));
    cout << ans << '\n';
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Incorrect 0 ms 348 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 194 ms 17376 KB Output is correct
2 Correct 180 ms 18540 KB Output is correct
3 Correct 73 ms 11456 KB Output is correct
4 Correct 46 ms 5288 KB Output is correct
5 Correct 112 ms 12352 KB Output is correct
6 Correct 39 ms 5140 KB Output is correct
7 Correct 2 ms 604 KB Output is correct
8 Correct 2 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 604 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 305 ms 21064 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 347 ms 20880 KB Output isn't correct
2 Halted 0 ms 0 KB -