제출 #408941

#제출 시각아이디문제언어결과실행 시간메모리
408941Vladth11Cities (BOI16_cities)C++14
100 / 100
2463 ms45412 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define debug(x) cerr << #x << " " << x << "\n" #define debugs(x) cerr << #x << " " << x << " " //#include"holiday.h" using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef pair <ll, ll> pii; typedef pair <long double, pii> muchie; typedef tree <ll, null_type, less_equal <ll>, rb_tree_tag, tree_order_statistics_node_update> OST; const ll NMAX = 100001; const ll INF = (1LL << 60); const ll HALF = (1LL << 59); const ll MOD = 666013; const ll BLOCK = 225; const ll base = 31; const ll nr_of_bits = 21; vector <pii> v[NMAX]; ll n, k, m; struct ura { ll a, b, c; }; vector <ura> edges; ll scor = 0; ll viz[NMAX]; bool cmp(ura a, ura b) { return a.c < b.c; } void add_Edge(ll a, ll b, ll c) { edges.push_back({a, b, c}); } ll d[NMAX][6]; ll dp[(1 << 6)][NMAX]; ll imp[NMAX]; ll special[NMAX]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k >> m; for(ll i = 1; i <= k; i++) { ll x; cin >> x; special[x] = i; imp[i - 1] = x; } for(ll i = 1; i <= m; i++) { ll a, b, c; cin >> a >> b >> c; v[a].push_back({b, c}); v[b].push_back({a, c}); } for(ll mask = 0; mask < (1 << k); mask++) { for(ll i = 0; i <= n; i++) dp[mask][i] = HALF; } for(ll i = 1; i <= k; i++) { dp[(1 << (i - 1))][imp[i - 1]] = 0; } for(ll i = 1; i <= n; i++) dp[0][i] = 0; for(ll mask = 0; mask < (1 << k); mask++) { for(ll i = 1; i <= n; i++) { for(ll submask = mask; submask > 0; submask = (submask - 1) & mask) { ll newmask = (mask ^ submask); if(special[i]) { newmask ^= (1 << (special[i] - 1)); } dp[mask][i] = min(dp[mask][i], dp[submask][i] + dp[newmask][i]); } } priority_queue <pii> pq; for(ll i = 0; i <= n; i++) { viz[i] = 0; pq.push({-dp[mask][i], i}); } while(pq.size()) { pii node = pq.top(); ll city = node.second; pq.pop(); if(viz[city]) continue; viz[city] = 1; for(auto x : v[city]) { if(dp[mask][city] + x.second < dp[mask][x.first]) { dp[mask][x.first] = dp[mask][city] + x.second; pq.push({-dp[mask][x.first], x.first}); } } } } ll sol = INF; for(ll i = 1; i <= n; i++) { sol = min(sol, dp[(1 << k) - 1][i]); } cout << sol; return 0; }
#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...