제출 #1121240

#제출 시각아이디문제언어결과실행 시간메모리
1121240LonlyRCities (BOI16_cities)C++17
74 / 100
6044 ms233352 KiB
#include<bits/stdc++.h>
#define ll long long
#define all(x) x.begin(), x.end()

using namespace std;
const int maxn = 1e5 + 5;
int n, k, m;
int chosen[maxn];
vector<pair<int,int>> adj[maxn];
vector<array<int, 3>> edges;
vector<int> ok;

    #define iii array<ll, 3>
    ll d[32][maxn];
    void full()
    {
        priority_queue<iii, vector<iii>, greater<iii>> pq;
        memset(d, 0x3f, sizeof d);
        ll oo = d[0][0];
        for (int i = 1; i <= n; i++)
        {
            int bit = 0;
            if (chosen[i])
                bit = 1 << (chosen[i] - 1);
            else continue;
            d[bit][i] = 0;
            pq.push({0, i, bit});
        }
        int full = (1 << k) - 1;
        while (pq.size())
        {
            auto to = pq.top();
            pq.pop();
            ll val = to[0], u = to[1], bit = to[2];
            if (val != d[bit][u]) continue;
            for (auto i : adj[u])
            {
                ll v, w;
                tie(v, w) = i;
                int not_mask = bit ^ full;
                if(d[bit][v] > val + w)
                    pq.push({d[bit][v] = val + w, v, bit});
                for(int s = not_mask; s > 0; s = (s - 1) & not_mask)
                    if(d[bit | s][v] > val + d[s][v] + w)
                        pq.push({d[bit | s][v] = val + d[s][v] + w, v, bit | s});
            }
        }
        ll res = oo;
        for (int i = 1; i <= n; i++)
            res = min(res, d[full][i]);
        cout << res;
    }


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
//    freopen("test.inp", "r", stdin);
//    freopen("test.out", "w", stdout);
    cin >> n >> k >> m;
    for (int i = 1, x; i <= k; i++)
        cin >> x, chosen[x] = 1;
    k = accumulate(chosen + 1, chosen + n + 1, 0ll);
    for (int i = 1; i <= n; i++)
        if (chosen[i])
            ok.emplace_back(i),
            chosen[i] = ok.size();
    for (int i = 1, u, v, w; i <= m; i++)
        cin >> u >> v >> w,
        adj[u].emplace_back(v, w),
        adj[v].emplace_back(u, w),
        edges.push_back({w, u, v});
    full();
}
#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...