제출 #1121237

#제출 시각아이디문제언어결과실행 시간메모리
1121237LonlyRCities (BOI16_cities)C++17
0 / 100
6070 ms233392 KiB
#include<bits/stdc++.h> #define ll long long #define all(x) x.begin(), x.end() using namespace std; const int maxn = 1e5 + 5; int n, k, m; int chosen[maxn]; vector<pair<int,int>> adj[maxn]; vector<array<int, 3>> edges; vector<int> ok; #define iii array<ll, 3> ll d[maxn][32]; void full() { priority_queue<iii, vector<iii>, greater<iii>> pq; memset(d, 0x3f, sizeof d); int oo = d[0][0]; for (int i = 1; i <= n; i++) { int bit = 0; if (chosen[i]) bit = 1 << (chosen[i] - 1); else continue; d[i][bit] = 0; pq.push({0, i, bit}); } int full = (1 << k) - 1; while (pq.size()) { auto to = pq.top(); pq.pop(); ll val = to[0], u = to[1], bit = to[2]; if (val != d[u][bit]) continue; for (auto i : adj[u]) { int v, w; tie(v, w) = i; int not_mask = bit ^ full; if(d[v][bit] > val + w) pq.push({d[v][bit] = val + w, v, bit}); for(int s = not_mask; s > 0; s = (s - 1) & not_mask) if(d[v][bit | s] > val + d[v][s] + w) pq.push({d[v][bit | s] = val + d[v][s] + w, v, bit | s}); } } ll res = oo; for (int i = 1; i <= n; i++) res = min(res, d[i][full]); cout << res; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen("test.inp", "r", stdin); // freopen("test.out", "w", stdout); cin >> n >> k >> m; for (int i = 1, x; i <= k; i++) cin >> x, chosen[x] = 1; k = accumulate(chosen + 1, chosen + n + 1, 0ll); for (int i = 1; i <= n; i++) if (chosen[i]) ok.emplace_back(i), chosen[i] = ok.size(); for (int i = 1, u, v, w; i <= m; i++) cin >> u >> v >> w, adj[u].emplace_back(v, w), adj[v].emplace_back(u, w), edges.push_back({w, u, v}); full(); }
#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...