Submission #526290

#TimeUsernameProblemLanguageResultExecution timeMemory
526290acyme_nomCities (BOI16_cities)C++14
100 / 100
2950 ms137220 KiB
/// acyme_nom /// #include <bits/stdc++.h> using namespace std; #define task "CITIESK" #define BUG(x) {cout << #x << " = " << x << '\n';} #define PR(x,l,r) {cout << #x << " = "; for(int i=l; i<=r; i++) cout << x[i] << ' '; cout << '\n';} #define MAXN 100011 using ld = long double; using ll = long long; using ii = pair<ll,ll>; #define X first #define Y second template <typename T> inline void read(T & x) { char c; bool nega=0; while((!isdigit(c=getchar()))&&c!='-'); if(c=='-') { c=getchar(); nega=1; } x=c-48; while(isdigit(c=getchar())) { x=x*10+c-48; } if(nega) x=-x; } template <typename T> void Write(T x) {if (x > 9) Write(x/10); putchar(x%10+48);} template <typename T> void write(T x) {if (x < 0) {putchar('-'); x = -x;} Write(x);} #define int long long int n,m,k; set <ii> adj[MAXN]; int dp[1<<7][MAXN]; /// dp[S][i] da di duoc tap S, dang o dinh i void read() { read(n); read(k); read(m); for(int mask=0; mask<(1<<7); mask++) for(int i=1; i<=n; i++) dp[mask][i] = 1e18; for(int i=1; i<=k; i++) { int x; read(x); dp[1<<(i-1)][x] = 0; } for(int i=1; i<=m; i++) { int u,v,c; read(u); read(v); read(c); adj[u].insert(ii(c,v)); adj[v].insert(ii(c,u)); } } void solve() { for(int mask = 0; mask<(1<<k); mask++) { for(int submask = mask; submask; submask = (submask-1)&mask) { if(submask==mask) continue; for(int i=1; i<=n; i++) { dp[mask][i] = min(dp[mask][i],dp[mask^submask][i] + dp[submask][i]); } } priority_queue <ii,vector<ii>,greater <ii> > pq; for(int i=1; i<=n; i++) { if(dp[mask][i]<1e18) pq.push(ii(dp[mask][i],i)); } while(!pq.empty()) { int u = pq.top().Y; int du = pq.top().X; pq.pop(); if(dp[mask][u]!=du) continue; for(auto e:adj[u]) { if(dp[mask][e.Y]>dp[mask][u]+e.X) { dp[mask][e.Y] = dp[mask][u] + e.X; pq.push(ii(dp[mask][e.Y],e.Y)); } } } } int fullmask = (1<<k)-1; int ans = 1e18; for(int i=1; i<=n; i++) ans = min(ans,dp[fullmask][i]); write(ans); } int32_t main() { int t; t = 1; // cin >> t; /// multitest while(t--) { read(); solve(); } 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...