제출 #1326056

#제출 시각아이디문제언어결과실행 시간메모리
1326056nhq0914Cities (BOI16_cities)C++20
64 / 100
1138 ms45840 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; const long long inf = 1e15; int n, k, m; int important[5]; vector <pair <int, int>> adj[maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k >> m; for(int i = 0; i < k; ++i) cin >> important[i]; for(int a, b, c; m--;) { cin >> a >> b >> c; adj[a].emplace_back(b, c); adj[b].emplace_back(a, c); } if(k == 2) { vector <long long> d(n + 1, inf); priority_queue <pair <long long, int>, vector <pair <long long, int>>, greater <pair <long long, int>>> q; int &s = important[0]; int &t = important[1]; q.emplace(d[s] = 0, s); for(int v, c; !q.empty();) { tie(v, c) = q.top(); q.pop(); if(c > d[v]) continue; for(auto &[x, w]: adj[v]) { if(d[x] <= c + w) continue; q.emplace(d[x] = c + w, x); } } cout << d[t]; return 0; } k -= 2; vector <vector <long long>> dis0(n + 1, vector <long long> (1 << k, inf)); vector <vector <long long>> dis1(n + 1, vector <long long> (1 << k, inf)); priority_queue <tuple <long long, int, int>, vector <tuple <long long, int, int>>, greater <tuple <long long, int, int>>> q; // using T = tuple <long long, int, int>; // T a = {0, 1, 2}, b = {2, 1, 0}; // cout << (a < b) << '\n'; // for(int i = 0; i < k + 2; ++i) cout << important[i] << ' '; // cout << '\n'; for(int i = 0; i < k; ++i){ // cout << i << ' ' << important[i] << '\n'; q.emplace(dis0[important[i]][1 << i] = 0, 1 << i, important[i]); } while(!q.empty()) { auto [d, s, v] = q.top(); q.pop(); if(d > dis0[v][s]) continue; for(auto &[x, w]: adj[v]) if(dis0[x][s] > d + w) { q.emplace(dis0[x][s] = d + w, s, x); } for(int mask = (1 << k) - 1 - s; mask; mask &= --mask){ if(dis0[v][s | mask] <= d + dis0[v][mask]) continue; q.emplace(dis0[v][s | mask] = d + dis0[v][mask], s | mask, v); } } // for(int i = 1; i <= n; ++i) // cout << "dis0 " << i << ' ' << dis0[i][1] << '\n'; q.emplace(dis1[important[k]][0] = 0, 0, important[k]); while(!q.empty()) { auto [d, s, v] = q.top(); q.pop(); if(d > dis1[v][s]) continue; // cout << d << ' ' << s << ' ' << v << '\n'; for(auto &[x, w]: adj[v]) if(dis1[x][s] > d + w) { q.emplace(dis1[x][s] = d + w, s, x); } for(int mask = (1 << k) - 1 - s; mask; mask &= --mask){ if(dis1[v][s | mask] <= d + dis0[v][mask]) continue; // if(d == 0 && s == 0 && v == 3) cout << "mask " << mask << ' ' << d << ' ' << dis0[v][mask] << '\n'; q.emplace(dis1[v][s | mask] = d + dis0[v][mask], s | mask, v); } } // cout << important[k + 1] << '\n'; cout << dis1[important[k + 1]][(1 << k) - 1]; cerr << "ok\n"; }
#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...