제출 #1245817

#제출 시각아이디문제언어결과실행 시간메모리
1245817nguyendinhtienCities (BOI16_cities)C++17
100 / 100
2249 ms58748 KiB
#include <bits/stdc++.h>
#define N 100000
#define ll long long
#define MOD 1000000007
#define inf 2000000000
#define llf 1000000000000000000
// #define base 31
#define MASK(i) (1 << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pil pair<int, ll>
#define pli pair<ll, int>
#define fi first
#define se second
#define el '\n'

using namespace std;

int n, m, K;
vector<pil> adj[N + 5];
ll dp[N + 5][50];

void solve()
{
    for(int mask = 0; mask < (1 << K); mask++)
    {
        if(!mask) continue;
        for(int sub = (mask - 1) & mask; sub; sub = (sub - 1) & mask)
        {
            int oth = mask ^ sub;
            for(int u = 1; u <= n; u++)
                dp[u][mask] = min(dp[u][mask], dp[u][sub] + dp[u][oth]);
        }

        priority_queue<pli, vector<pli>, greater<>> pq;
        for(int u = 1; u <= n; u++)
            if(dp[u][mask] < llf) pq.emplace(dp[u][mask], u);
        while(pq.size())
        {
            auto [len, u] = pq.top();
            pq.pop();
            if(len != dp[u][mask]) continue;
            for(auto [v, w] : adj[u])
            {
                ll W = len + w;
                if(dp[v][mask] > W)
                {
                    dp[v][mask] = W;
                    pq.emplace(W, v);
                }
            }
        }
    }

    ll ans = llf;
    for(int u = 1; u <= n; u++) ans = min(ans, dp[u][(1 << K) - 1]);
    cout << ans;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    // freopen(".INP", "r", stdin);
    // freopen(".OUT", "w", stdout);

    cin >> n >> K >> m;

    for(int i = 0; i <= n; i++)
        for(int mask = 0; mask < (1 << K); mask++)
            dp[i][mask] = llf;

    for(int u, i = 0; i < K; i++)
    {
        cin >> u;
        dp[u][1 << i] = 0;
    }

    for(int u, v, w, i = 1; i <= m; i++)
    {
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }

    solve();

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