Submission #258102

#TimeUsernameProblemLanguageResultExecution timeMemory
258102maximath_1Cities (BOI16_cities)C++11
100 / 100
1254 ms28200 KiB
#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <bitset> using namespace std; #define ll long long const ll inf = 1e18 + 69; int n, k, m; vector<pair<int, int> > adj[100005]; ll dp[16][100005]; bitset<100005> vis; int imp[5], rt; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; cin >> rt; k --; for(int i = 0; i < k; i ++) cin >> imp[i]; for(int u, v, w, i = 0; i < m; i ++){ cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } for(int i = 0; i < 16; i ++) for(int j = 1; j <= n; j ++){ if(i == 0) dp[i][j] = 0; else dp[i][j] = inf; } for(int msk = 0; msk < (1 << k); msk ++){ priority_queue<pair<ll, int>, vector<pair<ll, int> >, greater<pair<ll, int> > > pq; for(int i = 1; i <= n; i ++){ for(int submsk = (msk - 1) & msk; submsk; submsk = (submsk - 1) & msk) dp[msk][i] = min(dp[msk][i], dp[submsk][i] + dp[submsk ^ msk][i]); vis[i] = 0; pq.push({dp[msk][i], i}); } for(; !pq.empty();){ int nw = pq.top().second; pq.pop(); if(vis[nw]) continue; vis[nw] = 1; for(auto i : adj[nw]){ int nx = i.first, wt = i.second; if(dp[msk][nx] > dp[msk][nw] + wt){ dp[msk][nx] = dp[msk][nw] + wt; pq.push({dp[msk][nx], nx}); } } } for(int i = 0; i < k; i ++) dp[msk | (1 << i)][imp[i]] = min(dp[msk | (1 << i)][imp[i]], dp[msk][imp[i]]); } cout << dp[(1 << k) - 1][rt] << endl; 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...