Submission #408889

#TimeUsernameProblemLanguageResultExecution timeMemory
408889Vladth11Cities (BOI16_cities)C++14
0 / 100
209 ms32208 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" #pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #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 MOD = 666013; const ll BLOCK = 225; const ll base = 31; const ll nr_of_bits = 21; vector <pii> v[NMAX]; int n, k, m; struct ura { int a, b, c; }; vector <ura> edges; int scor = 0; int viz[NMAX]; bool cmp(ura a, ura b) { return a.c < b.c; } void add_Edge(int a, int b, int c) { edges.push_back({a, b, c}); } int d[NMAX][5]; int dp[(1 << 5)][NMAX]; int imp[NMAX]; int special[NMAX]; void dijkstra(int ind) { priority_queue <pii> pq; pq.push({0, imp[ind]}); for(int i = 0; i <= n; i++) { viz[i] = 0; } d[imp[ind]][ind] = 0; while(pq.size()) { pii node = pq.top(); int city = node.second; pq.pop(); if(viz[city]) continue; viz[city] = 1; for(auto x : v[city]) { if(d[city][ind] + x.second < d[x.first][ind]) { d[x.first][ind] = d[city][ind] + x.second; pq.push({-d[x.first][ind], x.first}); } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k >> m; priority_queue <pii> pq; for(int i = 1; i <= n; i++) { for(int t = 0; t < k; t++) d[i][t] = 2e9; } for(int i = 1; i <= k; i++) { int x; cin >> x; special[x] = i; imp[i - 1] = x; } for(int i = 1; i <= m; i++) { int a, b, c; cin >> a >> b >> c; v[a].push_back({b, c}); v[b].push_back({a, c}); } for(int i = 0; i < k; i++) { dijkstra(i); } for(int mask = 0; mask < (1 << k); mask++) { for(int i = 0; i <= n; i++) dp[mask][i] = 1e9; } for(int i = 1; i <= k; i++) { dp[(1 << (i - 1))][imp[i - 1]] = 0; } for(int i = 1; i <= n; i++) dp[0][i] = 0; for(int mask = 0; mask < (1 << k); mask++) { for(int i = 1; i <= n; i++) { for(int submask = mask; submask > 0; submask = (submask - 1) & mask) { if(special[i]) { if(!(mask & (1 << (i - 1))) || !(submask & (1 << (i - 1)))) continue; } int newmask = (mask ^ submask); if(special[i]){ newmask ^= (1 << (special[i] - 1)); } dp[mask][i] = min(dp[mask][i], dp[submask][i] + dp[newmask][i]); } } for(int i = 1; i <= n; i++) { for(int j = 0; j < k; j++) { if(special[i] && (i == imp[j] || !(mask & (1 << i)))) continue; if(!(mask & (1 << j))) continue; dp[mask][i] = min(dp[mask][i], dp[(mask ^ (1 << j))][i] + d[i][j]); } } } int sol = 2e9; for(int 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...