Submission #1314095

#TimeUsernameProblemLanguageResultExecution timeMemory
1314095nghiaxtoneriCities (BOI16_cities)C++20
100 / 100
1408 ms44808 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 1e5 + 5; const int M = 1 << 5 + 5; vector<pair<int,int>> g[2*N]; int dp[M][N],a[10]; bool used[N]; int n,k,m; int32_t main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n>>k>>m; int big = 1 << k; for(int i = 0;i<big;i++) for(int j = 1;j<=n;j++) dp[i][j] = 1e18; for(int i = 0;i<k;i++){ cin>>a[i]; dp[1 << i][a[i]] = 0; } for(int i = 0;i<m;i++){ int u,v,w;cin>>u>>v>>w; g[u].push_back({v,w}); g[v].push_back({u,w}); } for(int mask = 0;mask < big;mask++){ for(int sub = mask;sub > 0;sub = (sub - 1)&mask){ int l = sub; int r = mask^sub; if(l > r) continue; for(int i = 1;i<=n;i++) dp[mask][i] = min(dp[mask][i],dp[l][i] + dp[r][i]); } priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q; for(int i = 1;i<=n;i++){ q.push({dp[mask][i],i}); used[i] = false; } while(!q.empty()){ int u = q.top().second;q.pop(); if(used[u]) continue; used[u] = true; for(auto it : g[u]){ int v = it.first; int w = it.second; if(dp[mask][v] > dp[mask][u] + w){ dp[mask][v] = dp[mask][u] + w; q.push({dp[mask][v],v}); } } } } int res = 1e18; for(int j = 1;j<=n;j++) res = min(res,dp[big - 1][j]); cout<<res; 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...