Submission #84260

#TimeUsernameProblemLanguageResultExecution timeMemory
84260Flying_dragon_02Cities (BOI16_cities)C++14
74 / 100
3274 ms263168 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define pb push_back
#define mp make_pair

typedef pair<int, int> ii;

const int N = 1e5 + 5;

long long f[N][(1 << 5)];

int n, k, m;

vector<int> vec[(1 << 5)];
typedef pair<long long, ii> pii;

priority_queue<pii, vector<pii>, greater<pii>> pq;

vector<ii> graph[N];

int main() {
    cin.tie(0), ios::sync_with_stdio(0);
    cin >> n >> k >> m;
    for(int mask1 = 0; mask1 < (1 << k); mask1++) {
        for(int mask2 = 0; mask2 < (1 << k); mask2++) {
            if(!(mask1 & mask2))
                vec[mask1].pb(mask2);
        }
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j < (1 << k); j++)
            f[i][j] = LLONG_MAX;
    }
    for(int i = 1; i <= n; i++)
        f[i][0] = 0;
    for(int i = 1; i <= k; i++) {
        int x;
        cin >> x;
        f[x][(1 << (i - 1))] = 0;
        pq.push({0, {x, (1 << (i - 1))}});
    }
    for(int i = 1; i <= m; i++) {
        int u, v, c;
        cin >> u >> v >> c;
        graph[u].pb({v, c});
        graph[v].pb({u, c});
    }
    while(!pq.empty()) {
        pii frt = pq.top();
        pq.pop();
        if(frt.se.se == (1 << k) - 1) {
            cout << f[frt.se.fi][frt.se.se];
            exit(0);
        }
        int u = frt.se.fi, mask = frt.se.se;
        if(frt.fi > f[u][mask]) continue;
        for(int i = 0; i < graph[u].size(); i++) {
            int v = graph[u][i].fi, w = graph[u][i].se;
            for(int j = 0; j < vec[mask].size(); j++) {
                int nmask = vec[mask][j], newmask = (mask | nmask);
                if(f[v][nmask] == LLONG_MAX) continue;
                if(f[v][newmask] > f[u][mask] + w + f[v][nmask]) {
                    f[v][newmask] = f[u][mask] + w + f[v][nmask];
                    pq.push({f[v][newmask], {v, newmask}});
                }
                if(f[u][newmask] > f[u][mask] + w + f[v][nmask]) {
                    f[u][newmask] = f[u][mask] + w + f[v][nmask];
                    pq.push({f[u][newmask], {u, newmask}});
                }
            }
        }
    }
}

Compilation message (stderr)

cities.cpp: In function 'int main()':
cities.cpp:61:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0; i < graph[u].size(); i++) {
                        ~~^~~~~~~~~~~~~~~~~
cities.cpp:63:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j = 0; j < vec[mask].size(); j++) {
                            ~~^~~~~~~~~~~~~~~~~~
#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...