제출 #375857

#제출 시각아이디문제언어결과실행 시간메모리
375857danielcm585Cities (BOI16_cities)C++14
100 / 100
3458 ms50760 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second typedef long long ll; typedef pair<ll,int> ii; const int N = 1e5; const int K = 5; const int MX = (1<<K); const ll INF = 1e18; int n, m, k; int s[K+2]; ll dp[N+2][MX+2]; vector<ii> adj[N+2]; void djikstra(int mask) { priority_queue<ii,vector<ii>,greater<ii>> pq; for (int i = 0; i < n; i++) pq.push({dp[i][mask],i}); while (!pq.empty()) { ii cur = pq.top(); pq.pop(); if (dp[cur.se][mask] != cur.fi) continue; for (auto i : adj[cur.se]) { ii nx = {cur.fi+i.se,i.fi}; if (dp[nx.se][mask] > nx.fi) { dp[nx.se][mask] = nx.fi; pq.push(nx); } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; for (int i = 0; i < k; i++) { cin >> s[i]; s[i]--; } for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; u--, v--; adj[u].push_back({v,w}); adj[v].push_back({u,w}); } for (int i = 0; i < n; i++) { for (int j = 0; j < (1<<k); j++) { dp[i][j] = INF; } } for (int mask = 1; mask < (1<<k); mask++) { if (__builtin_popcount(mask) == 1) { for (int i = 0; i < k; i++) { if ((mask>>i)&1) dp[s[i]][mask] = 0; } } for (int i = 0; i < k; i++) { if ((mask>>i)&1) { for (int j = 0; j < n; j++) { dp[j][mask] = min(dp[j][mask],dp[j][1<<i]+dp[j][mask^(1<<i)]); } } } djikstra(mask); } ll ans = INF; for (int i = 0; i < n; i++) { ans = min(ans,dp[i][(1<<k)-1]); } cout << ans << '\n'; 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...