Submission #485815

#TimeUsernameProblemLanguageResultExecution timeMemory
485815RainbowbunnyCities (BOI16_cities)C++17
100 / 100
1858 ms47384 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 5;
const long long INF = 1e18;

int n, m, k;
long long dp[32][MAXN];
vector <pair <int, long long> > Adj[MAXN];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> k >> m;
    for(int i = 0; i < 32; i++)
    {
        for(int j = 0; j < MAXN; j++)
        {
            dp[i][j] = INF;
        }
    }
    for(int i = 0; i < k; i++)
    {
        int id;
        cin >> id;
        dp[1 << i][id] = 0;
    }
    for(int i = 1; i <= m; i++)
    {
        int u, v;
        long long c;
        cin >> u >> v >> c;
        Adj[u].emplace_back(v, c);
        Adj[v].emplace_back(u, c);
    }
    for(int i = 1; i < (1 << k); i++)
    {
        for(int mask = i; mask > 0; mask = (mask - 1) & i)
        {
            if(mask == i)
            {
                continue;
            }
            for(int j = 1; j <= n; j++)
            {
                dp[i][j] = min(dp[i][j], dp[i ^ mask][j] + dp[mask][j]);
            }
        }
        priority_queue <pair <long long, int> > pq;
        for(int j = 1; j <= n; j++)
        {
            if(dp[i][j] != INF)
            {
                pq.emplace(-dp[i][j], j);
            }
        }
        while(pq.empty() == false)
        {
            long long d = -pq.top().first, v = pq.top().second;
            pq.pop();
            if(d != dp[i][v])
            {
                continue;
            }
            for(auto x : Adj[v])
            {
                if(dp[i][x.first] > d + x.second)
                {
                    dp[i][x.first] = d + x.second;
                    pq.emplace(-dp[i][x.first], x.first);
                }
            }
        }
    }
    cout << *min_element(dp[(1 << k) - 1] + 1, dp[(1 << k) - 1] + n + 1) << '\n';
}
#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...