Submission #258101

#TimeUsernameProblemLanguageResultExecution timeMemory
258101NightlightCities (BOI16_cities)C++14
100 / 100
1195 ms61208 KiB
#include <bits/stdc++.h> #define pii pair<long long, int> using namespace std; int N, K, M; int id[10]; vector<pii> adj[100005]; long long dist[7][100005]; long long dist2[7][7][100005]; priority_queue<pii, vector<pii>, greater<pii>> pq; void BFS(int now) { int st = id[now]; pq.emplace(0, st); dist[now][st] = 0; int u, v; long long len, w; while(!pq.empty()) { u = pq.top().second; len = pq.top().first; pq.pop(); if(dist[now][u] < len) continue; for(pii tmp : adj[u]) { v = tmp.second; w = tmp.first; if(dist[now][v] > dist[now][u] + w) { dist[now][v] = dist[now][u] + w; pq.emplace(dist[now][v], v); } } } } void BFS2(int a, int b) { for(int i = 1; i <= N; i++) { pq.emplace(dist2[a][b][i], i); } int u, v; long long len, w; while(!pq.empty()) { u = pq.top().second; len = pq.top().first; pq.pop(); if(dist2[a][b][u] < len) continue; for(pii tmp : adj[u]) { v = tmp.second; w = tmp.first; if(dist2[a][b][v] > dist2[a][b][u] + w) { dist2[a][b][v] = dist2[a][b][u] + w; pq.emplace(dist2[a][b][v], v); } } } } int main() { memset(dist, 0x3f3f3f3f, sizeof(dist)); memset(dist2, 0x3f3f3f3f, sizeof(dist2)); ios_base::sync_with_stdio(0); cin >> N >> K >> M; int u, v; long long w; for(int i = 1; i <= K; i++) cin >> id[i]; for(int i = 1; i <= M; i++) { cin >> u >> v >> w; adj[u].emplace_back(w, v); adj[v].emplace_back(w, u); } for(int i = 1; i <= K; i++) { BFS(i); for(int k = 1; k <= N; k++) { dist2[i][i][k] = dist[i][k]; } for(int j = 1; j < i; j++) { for(int k = 1; k <= N; k++) { dist2[i][j][k] = dist[i][k] + dist[j][k]; } BFS2(i, j); } } for(int i = 1; i <= K; i++) { for(int j = i + 1; j <= K; j++) { for(int k = 1; k <= N; k++) { dist2[i][j][k] = dist2[j][i][k]; } } } long long ans = LLONG_MAX; if(K == 2) { ans = dist[1][id[2]]; }else if(K == 3) { for(int i = 1; i <= N; i++) { ans = min(ans, dist[1][i] + dist[2][i] + dist[3][i]); } }else if(K == 4) { for(int i = 1; i <= N; i++) { ans = min(ans, dist2[1][3][i] + dist2[2][4][i]); ans = min(ans, dist2[1][2][i] + dist2[3][4][i]); ans = min(ans, dist2[1][4][i] + dist2[2][3][i]); } }else { for(int i = 1; i <= N; i++) { ans = min(ans, dist2[1][2][i] + dist2[3][4][i] + dist[5][i]); ans = min(ans, dist2[1][2][i] + dist2[3][5][i] + dist[4][i]); ans = min(ans, dist2[1][2][i] + dist2[4][3][i] + dist[5][i]); ans = min(ans, dist2[1][2][i] + dist2[4][5][i] + dist[3][i]); ans = min(ans, dist2[1][2][i] + dist2[5][3][i] + dist[4][i]); ans = min(ans, dist2[1][2][i] + dist2[5][4][i] + dist[3][i]); ans = min(ans, dist2[1][3][i] + dist2[2][4][i] + dist[5][i]); ans = min(ans, dist2[1][3][i] + dist2[2][5][i] + dist[4][i]); ans = min(ans, dist2[1][3][i] + dist2[4][2][i] + dist[5][i]); ans = min(ans, dist2[1][3][i] + dist2[4][5][i] + dist[2][i]); ans = min(ans, dist2[1][3][i] + dist2[5][2][i] + dist[4][i]); ans = min(ans, dist2[1][3][i] + dist2[5][4][i] + dist[2][i]); ans = min(ans, dist2[1][4][i] + dist2[2][3][i] + dist[5][i]); ans = min(ans, dist2[1][4][i] + dist2[2][5][i] + dist[3][i]); ans = min(ans, dist2[1][4][i] + dist2[3][2][i] + dist[5][i]); ans = min(ans, dist2[1][4][i] + dist2[3][5][i] + dist[2][i]); ans = min(ans, dist2[1][4][i] + dist2[5][2][i] + dist[3][i]); ans = min(ans, dist2[1][4][i] + dist2[5][3][i] + dist[2][i]); ans = min(ans, dist2[1][5][i] + dist2[2][3][i] + dist[4][i]); ans = min(ans, dist2[1][5][i] + dist2[2][4][i] + dist[3][i]); ans = min(ans, dist2[1][5][i] + dist2[3][2][i] + dist[4][i]); ans = min(ans, dist2[1][5][i] + dist2[3][4][i] + dist[2][i]); ans = min(ans, dist2[1][5][i] + dist2[4][2][i] + dist[3][i]); ans = min(ans, dist2[1][5][i] + dist2[4][3][i] + dist[2][i]); ans = min(ans, dist2[2][1][i] + dist2[3][4][i] + dist[5][i]); ans = min(ans, dist2[2][1][i] + dist2[3][5][i] + dist[4][i]); ans = min(ans, dist2[2][1][i] + dist2[4][3][i] + dist[5][i]); ans = min(ans, dist2[2][1][i] + dist2[4][5][i] + dist[3][i]); ans = min(ans, dist2[2][1][i] + dist2[5][3][i] + dist[4][i]); ans = min(ans, dist2[2][1][i] + dist2[5][4][i] + dist[3][i]); ans = min(ans, dist2[2][3][i] + dist2[1][4][i] + dist[5][i]); ans = min(ans, dist2[2][3][i] + dist2[1][5][i] + dist[4][i]); ans = min(ans, dist2[2][3][i] + dist2[4][1][i] + dist[5][i]); ans = min(ans, dist2[2][3][i] + dist2[4][5][i] + dist[1][i]); ans = min(ans, dist2[2][3][i] + dist2[5][1][i] + dist[4][i]); ans = min(ans, dist2[2][3][i] + dist2[5][4][i] + dist[1][i]); ans = min(ans, dist2[2][4][i] + dist2[1][3][i] + dist[5][i]); ans = min(ans, dist2[2][4][i] + dist2[1][5][i] + dist[3][i]); ans = min(ans, dist2[2][4][i] + dist2[3][1][i] + dist[5][i]); ans = min(ans, dist2[2][4][i] + dist2[3][5][i] + dist[1][i]); ans = min(ans, dist2[2][4][i] + dist2[5][1][i] + dist[3][i]); ans = min(ans, dist2[2][4][i] + dist2[5][3][i] + dist[1][i]); ans = min(ans, dist2[2][5][i] + dist2[1][3][i] + dist[4][i]); ans = min(ans, dist2[2][5][i] + dist2[1][4][i] + dist[3][i]); ans = min(ans, dist2[2][5][i] + dist2[3][1][i] + dist[4][i]); ans = min(ans, dist2[2][5][i] + dist2[3][4][i] + dist[1][i]); ans = min(ans, dist2[2][5][i] + dist2[4][1][i] + dist[3][i]); ans = min(ans, dist2[2][5][i] + dist2[4][3][i] + dist[1][i]); ans = min(ans, dist2[3][1][i] + dist2[2][4][i] + dist[5][i]); ans = min(ans, dist2[3][1][i] + dist2[2][5][i] + dist[4][i]); ans = min(ans, dist2[3][1][i] + dist2[4][2][i] + dist[5][i]); ans = min(ans, dist2[3][1][i] + dist2[4][5][i] + dist[2][i]); ans = min(ans, dist2[3][1][i] + dist2[5][2][i] + dist[4][i]); ans = min(ans, dist2[3][1][i] + dist2[5][4][i] + dist[2][i]); ans = min(ans, dist2[3][2][i] + dist2[1][4][i] + dist[5][i]); ans = min(ans, dist2[3][2][i] + dist2[1][5][i] + dist[4][i]); ans = min(ans, dist2[3][2][i] + dist2[4][1][i] + dist[5][i]); ans = min(ans, dist2[3][2][i] + dist2[4][5][i] + dist[1][i]); ans = min(ans, dist2[3][2][i] + dist2[5][1][i] + dist[4][i]); ans = min(ans, dist2[3][2][i] + dist2[5][4][i] + dist[1][i]); ans = min(ans, dist2[3][4][i] + dist2[1][2][i] + dist[5][i]); ans = min(ans, dist2[3][4][i] + dist2[1][5][i] + dist[2][i]); ans = min(ans, dist2[3][4][i] + dist2[2][1][i] + dist[5][i]); ans = min(ans, dist2[3][4][i] + dist2[2][5][i] + dist[1][i]); ans = min(ans, dist2[3][4][i] + dist2[5][1][i] + dist[2][i]); ans = min(ans, dist2[3][4][i] + dist2[5][2][i] + dist[1][i]); ans = min(ans, dist2[3][5][i] + dist2[1][2][i] + dist[4][i]); ans = min(ans, dist2[3][5][i] + dist2[1][4][i] + dist[2][i]); ans = min(ans, dist2[3][5][i] + dist2[2][1][i] + dist[4][i]); ans = min(ans, dist2[3][5][i] + dist2[2][4][i] + dist[1][i]); ans = min(ans, dist2[3][5][i] + dist2[4][1][i] + dist[2][i]); ans = min(ans, dist2[3][5][i] + dist2[4][2][i] + dist[1][i]); ans = min(ans, dist2[4][1][i] + dist2[2][3][i] + dist[5][i]); ans = min(ans, dist2[4][1][i] + dist2[2][5][i] + dist[3][i]); ans = min(ans, dist2[4][1][i] + dist2[3][2][i] + dist[5][i]); ans = min(ans, dist2[4][1][i] + dist2[3][5][i] + dist[2][i]); ans = min(ans, dist2[4][1][i] + dist2[5][2][i] + dist[3][i]); ans = min(ans, dist2[4][1][i] + dist2[5][3][i] + dist[2][i]); ans = min(ans, dist2[4][2][i] + dist2[1][3][i] + dist[5][i]); ans = min(ans, dist2[4][2][i] + dist2[1][5][i] + dist[3][i]); ans = min(ans, dist2[4][2][i] + dist2[3][1][i] + dist[5][i]); ans = min(ans, dist2[4][2][i] + dist2[3][5][i] + dist[1][i]); ans = min(ans, dist2[4][2][i] + dist2[5][1][i] + dist[3][i]); ans = min(ans, dist2[4][2][i] + dist2[5][3][i] + dist[1][i]); ans = min(ans, dist2[4][3][i] + dist2[1][2][i] + dist[5][i]); ans = min(ans, dist2[4][3][i] + dist2[1][5][i] + dist[2][i]); ans = min(ans, dist2[4][3][i] + dist2[2][1][i] + dist[5][i]); ans = min(ans, dist2[4][3][i] + dist2[2][5][i] + dist[1][i]); ans = min(ans, dist2[4][3][i] + dist2[5][1][i] + dist[2][i]); ans = min(ans, dist2[4][3][i] + dist2[5][2][i] + dist[1][i]); ans = min(ans, dist2[4][5][i] + dist2[1][2][i] + dist[3][i]); ans = min(ans, dist2[4][5][i] + dist2[1][3][i] + dist[2][i]); ans = min(ans, dist2[4][5][i] + dist2[2][1][i] + dist[3][i]); ans = min(ans, dist2[4][5][i] + dist2[2][3][i] + dist[1][i]); ans = min(ans, dist2[4][5][i] + dist2[3][1][i] + dist[2][i]); ans = min(ans, dist2[4][5][i] + dist2[3][2][i] + dist[1][i]); ans = min(ans, dist2[5][1][i] + dist2[2][3][i] + dist[4][i]); ans = min(ans, dist2[5][1][i] + dist2[2][4][i] + dist[3][i]); ans = min(ans, dist2[5][1][i] + dist2[3][2][i] + dist[4][i]); ans = min(ans, dist2[5][1][i] + dist2[3][4][i] + dist[2][i]); ans = min(ans, dist2[5][1][i] + dist2[4][2][i] + dist[3][i]); ans = min(ans, dist2[5][1][i] + dist2[4][3][i] + dist[2][i]); ans = min(ans, dist2[5][2][i] + dist2[1][3][i] + dist[4][i]); ans = min(ans, dist2[5][2][i] + dist2[1][4][i] + dist[3][i]); ans = min(ans, dist2[5][2][i] + dist2[3][1][i] + dist[4][i]); ans = min(ans, dist2[5][2][i] + dist2[3][4][i] + dist[1][i]); ans = min(ans, dist2[5][2][i] + dist2[4][1][i] + dist[3][i]); ans = min(ans, dist2[5][2][i] + dist2[4][3][i] + dist[1][i]); ans = min(ans, dist2[5][3][i] + dist2[1][2][i] + dist[4][i]); ans = min(ans, dist2[5][3][i] + dist2[1][4][i] + dist[2][i]); ans = min(ans, dist2[5][3][i] + dist2[2][1][i] + dist[4][i]); ans = min(ans, dist2[5][3][i] + dist2[2][4][i] + dist[1][i]); ans = min(ans, dist2[5][3][i] + dist2[4][1][i] + dist[2][i]); ans = min(ans, dist2[5][3][i] + dist2[4][2][i] + dist[1][i]); ans = min(ans, dist2[5][4][i] + dist2[1][2][i] + dist[3][i]); ans = min(ans, dist2[5][4][i] + dist2[1][3][i] + dist[2][i]); ans = min(ans, dist2[5][4][i] + dist2[2][1][i] + dist[3][i]); ans = min(ans, dist2[5][4][i] + dist2[2][3][i] + dist[1][i]); ans = min(ans, dist2[5][4][i] + dist2[3][1][i] + dist[2][i]); ans = min(ans, dist2[5][4][i] + dist2[3][2][i] + dist[1][i]); } } cout << ans << "\n"; cin >> N; }
#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...