Submission #1306159

#TimeUsernameProblemLanguageResultExecution timeMemory
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; }

Compilation message (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...