제출 #1342175

#제출 시각아이디문제언어결과실행 시간메모리
1342175dex111222333444555Cities (BOI16_cities)C++20
100 / 100
1823 ms40612 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[MASK(MAXK)][MAXN];
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(const int &mask){
    priority_queue<lli, vector<lli>, greater<lli> > q;
    for(int u = 1; u <= numNode; u++) q.emplace(dist[mask][u], u);

    while(siz(q)){
        int u = q.top().se;
        long long len = q.top().fi;
        q.pop();
        if (len > dist[mask][u]) continue;

        for(ii x: adj[u]){
            int v = x.fi, w = x.se;
            if (minimize(dist[mask][v], dist[mask][u] + w)) q.emplace(dist[mask][v], v);
        }
    }
}

void solve(){
    memset(dist, 0x3f, sizeof dist);

    for(int u = 1; u <= numNode; u++) dist[0][u] = 0;
    for(int i = 0; i < numImp; i++) dist[MASK(i)][imp[i]] = 0;

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

    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";
}

컴파일 시 표준 에러 (stderr) 메시지

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