Submission #1342151

#TimeUsernameProblemLanguageResultExecution timeMemory
1342151dex111222333444555Cities (BOI16_cities)C++20
74 / 100
6096 ms165488 KiB
#include <bits/stdc++.h>
#define all(v) begin(v), end(v)
#define ii pair<int, int>
#define fi first
#define se second
#define siz(v) (int)(v).size()
#define lli pair<long long, int>
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(i) (1LL << (i))

using namespace std;

template<class X, class Y> bool minimize(X &x, const Y &y){return x > y ? x = y, 1: 0;}

const int MAXN = 1e5 + 5, MAXM = 2e5 + 5, MAXK = 5;
const long long inf = 1e18 + 123;

int numNode, numImp, numEdge, imp[MAXN];
long long dist[MAXN][MASK(MAXK)];
vector<ii > adj[MAXN];

struct S{
    int u, mask;
    long long len;

    S(long long _len = 0, int _u = 0, int _mask = 0):
        len(_len), u(_u), mask(_mask) {};

    bool operator <(const S &other) const{
        return len > other.len;
    }
};

void input(){
    cin >> numNode >> numImp >> numEdge;

    for(int i = 0; i < numImp; i++) cin >> imp[i];

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

void dijsktra(){
    memset(dist, 0x3f, sizeof dist);
    priority_queue<S > q;

    for(int i = 0; i < numImp; i++){
        q.push(S(dist[imp[i]][MASK(i)] = 0, imp[i], MASK(i)));
    }

    for(int i = 1; i <= numNode; i++){
        q.push(S(dist[i][0] = 0, i, 0));
    }

    while(siz(q)){
        int u = q.top().u, mask = q.top().mask;
        long long len = q.top().len;
        q.pop();

        if (len > dist[u][mask]) continue;

        for(ii x: adj[u]){
            int v = x.fi, w = x.se;
            int invmask = (MASK(numImp) - 1) ^ mask;
            for(int nmask = invmask; ; nmask = (nmask - 1) & invmask){
                if (minimize(dist[v][nmask | mask], dist[u][mask] + dist[v][nmask] + w))
                    q.emplace(S(dist[v][nmask | mask], v, nmask | mask));
                if (nmask == 0) break;
            }
        }
    }
}

void solve(){
    dijsktra();

    long long best = inf;
    for(int u = 1; u <= numNode; u++){
        for(int mask = 0; mask < MASK(numImp); mask++){
            for(int submask = mask; ; submask = (submask - 1) & mask){
                minimize(dist[u][mask], dist[u][submask] + dist[u][mask ^ submask]);
                if (submask == 0) break;
            }
        }
        minimize(best, dist[u][MASK(numImp) - 1]);
    }

    cout << best << '\n';
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #define task "test"
    if (fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    int t = 1;
//    cin >> t;
    while(t--){
        input();
        solve();
    }
    cerr << (1.0 * clock()) / CLOCKS_PER_SEC << ".s\n";
}

Compilation message (stderr)

cities.cpp: In function 'int main()':
cities.cpp:98:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   98 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
cities.cpp:99:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...