제출 #1194185

#제출 시각아이디문제언어결과실행 시간메모리
1194185LucaIlieCities (BOI16_cities)C++17
100 / 100
615 ms27928 KiB
#include <bits/stdc++.h> using namespace std; struct edge { int u, v, c; int other(int w) { return u ^ v ^ w; } }; struct infopq { int v; long long d; bool operator<(const infopq &x) const { return d > x.d; } }; const int MAX_N = 1e5; const int MAX_M = 2e5; const int MAX_K = 5; const long long INF = 1e18; int n; edge edges[MAX_M]; vector<int> adj[MAX_N + 1]; int cities[MAX_K]; long long dist[(1 << (MAX_K - 1))][MAX_N + 1]; bool vis[MAX_N + 1]; void dijkstra(long long dist[]) { priority_queue<infopq> pq; for (int v = 1; v <= n; v++) { vis[v] = false; pq.push({v, dist[v]}); } while (!pq.empty()) { auto u = pq.top().v; pq.pop(); if (vis[u]) continue; vis[u] = true; for (int e: adj[u]) { int v = edges[e].other(u), c = edges[e].c; if (dist[u] + c < dist[v]) { dist[v] = dist[u] + c; pq.push({v, dist[v]}); } } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int k, m; cin >> n >> k >> m; for (int i = 0; i < k; i++) cin >> cities[i]; for (int e = 0; e < m; e++) { cin >> edges[e].u >> edges[e].v >> edges[e].c; adj[edges[e].u].push_back(e); adj[edges[e].v].push_back(e); } for (int mask = 1; mask < (1 << (k - 1)); mask++) { for (int v = 1; v <= n; v++) dist[mask][v] = INF; } for (int i = 0; i < k - 1; i++) dist[(1 << i)][cities[i]] = 0; for (int mask = 1; mask < (1 << (k - 1)); mask++) { dijkstra(dist[mask]); for (int mask2 = 1; mask2 < mask; mask2++) { for (int v = 1; v <= n; v++) dist[mask | mask2][v] = min(dist[mask | mask2][v], dist[mask][v] + dist[mask2][v]); } /* printf("MASK %d\n", mask); */ /* for (int v = 1; v <= n; v++) */ /* printf("%lld ", dist[mask][v]); */ /* printf("\n"); */ } cout << dist[(1 << (k - 1)) - 1][cities[k - 1]] << "\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...