제출 #1306159

#제출 시각아이디문제언어결과실행 시간메모리
1306159tutithuybi123Cities (BOI16_cities)C++20
100 / 100
503 ms28860 KiB
#include <bits/stdc++.h>
#define task ""
#define int long long
#define ll long long
#define endl "\n"
#define double long double
#define ii pair<int, int>
#define li pair<ll, int>
#define fi first
#define se second
#define f0(i, n) for (int i = 0; i < n; ++i)
#define f1(i, n) for (int i = 1; i <= n; ++i)
#define c_bit(i)       __builtin_popcountll(i)
#define Bit(mask, i)    ((mask >> i) & 1)
#define onbit(mask, i)  ((mask) bitor (1LL << i))
#define offbit(mask, i) ((mask) &~ (1LL << i))
#define reversebit(mask, i) ((mask) ^ (1LL << i))
#define log2(n) 63 - __builtin_clzll(n)


using namespace std;
template <typename T> bool maximize(T &a, T b) { return a < b ? a = b, true : false; }
template <typename T> bool minimize(T &a, T b) { return a > b ? a = b, true : false; }
template <typename T> using pqmin = priority_queue<T, vector <T >, greater <T >>;
//_____________________________________________________________________________________

const int maxn = 1e5 * 1ll + 5;
const int mod = 1e9 + 7;
const int oo = 1e18 * 1ll;

ll n, k, m, root;
ll impt[6];
ll f[1 << 5][maxn];
vector <ii> a[maxn];

struct state{
    ll dist;
    ll u;

    bool operator < (const state &other) const {
        return dist > other.dist;
    }
};

//_____________________________________________________________________________________
signed main()
{
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    if(fopen(task".inp","r")){
       freopen(task".inp","r",stdin);
       freopen(task".out","w",stdout);
    }

    cin >> n >> k >> m;
    cin >> root; k--;

    f0 (i, k) cin >> impt[i];

    f1 (i, m){
        ll u, v, w; cin >> u >> v >> w;
        a[u].push_back({v, w});
        a[v].push_back({u, w});
    }

    f1 (mask, (1 << k) - 1) f1 (i, n) f[mask][i] = oo;

    priority_queue <state> pq;

    pq.push({0, root});

    f0 (mask, 1 << k) {
        f1(i, n) {
            for(int sub = mask; sub >= 0; --sub) {
                sub &= mask;
                minimize(f[mask][i], f[sub][i] + f[mask ^ sub][i]);
            }
            if(f[mask][i] != oo) pq.push({f[mask][i], i});
        }
        while(!pq.empty()) {
            ll dist = pq.top().dist;
            ll u = pq.top().u;
            pq.pop();
            if(dist > f[mask][u]) continue;
            for(ii x : a[u]) {
                ll v = x.first;
                ll w = x.second;
                if(minimize(f[mask][v], dist + w)) {
                    pq.push({f[mask][v], v});
                }
            }
        }
        f0 (i, k) minimize(f[mask | (1 << i)][impt[i]], f[mask][impt[i]]);
    }
    cout << f[(1 << k) - 1][root];

    return 0;
}

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

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