Submission #253869

#TimeUsernameProblemLanguageResultExecution timeMemory
253869super_j6Cities (BOI16_cities)C++14
14 / 100
6050 ms111216 KiB
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <vector> #include <set> using namespace std; #define endl '\n' #define ll long long #define pi pair<ll, ll> #define f first #define s second ll inf = 0x3f3f3f3f3f3f3f3f; const int mxn = 100000, mxk = 6; int n, m, k; int a[mxk], s[mxk]; ll dd[mxn], vis[mxn]; vector<ll> d[mxn], p[mxn]; vector<pi> g[mxn]; set<pi> pq; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> m; for(int i = 0; i < k; i++){ cin >> a[i]; a[i]--; } for(int i = 0; i < m; i++){ int u, v, w; cin >> u >> v >> w; u--, v--; g[u].push_back({v, w}); g[v].push_back({u, w}); } for(int s = 0; s < n; s++){ if(k > 4 || count(a, a + k, s)){ d[s].assign(n, inf); p[s].assign(n, -1); d[s][s] = 0; pq.insert({0, s}); while(!pq.empty()){ int c = pq.begin()->s; pq.erase(pq.begin()); for(pi i : g[c]){ if(d[s][c] + i.s < d[s][i.f]){ pq.erase({d[s][c], i.f}); pq.insert({d[s][i.f] = d[s][c] + i.s, i.f}); p[s][i.f] = c; } } } } } ll ret = inf; if(k <= 3){ for(int i = 0; i < n; i++){ ll cur = 0; for(int j = 0; j < k; j++){ cur += d[a[j]][i]; } ret = min(ret, cur); } }else if(k == 4){ for(int i = 0; i < n; i++){ ll cur = 0; for(int j = 0; j < k; j++){ cur += d[a[j]][i]; } ret = min(ret, cur); } for(int s1 = 0; s1 < k; s1++) for(int s2 = 0; s2 < s1; s2++){ ll s3 = -1, s4 = -1; for(int i = 0; i < k; i++){ if(s1 != i && s2 != i){ if(!~s3) s3 = i; else s4 = i; } } ll cur = d[a[s1]][a[s2]] + d[a[s3]][a[s4]]; memset(dd, inf, sizeof(dd)); memset(vis, 0, sizeof(vis)); for(int i = a[s2]; ~i; i = p[a[s1]][i]){ dd[i] = 0; pq.insert({0, i}); } for(int i = a[s4]; ~i; i = p[a[s3]][i]) vis[i] = 1; while(!pq.empty()){ int c = pq.begin()->s; pq.erase(pq.begin()); if(vis[c]){ cur += dd[c]; while(!pq.empty()) pq.erase(pq.begin()); break; } for(pi i : g[c]){ if(dd[c] + i.s < dd[i.f]){ pq.erase({dd[c], i.f}); pq.insert({dd[i.f] = dd[c] + i.s, i.f}); } } } ret = min(ret, cur); } }else{ s[0] = 1; for(int i = 1; i <= k; i++) s[i] = 3 * s[i - 1]; for(int i[3] = {0}; i[0] < n; i[0]++) for(i[1] = 0; i[1] < n; i[1]++) for(i[2] = 0; i[2] < n; i[2]++) for(int j = 0; j < s[k]; j++){ ll cur = inf; for(int l = 0; l < n; l++) cur = min(cur, d[i[0]][l] + d[i[1]][l] + d[i[2]][l]); for(int l = 0; l < k; l++){ cur += d[a[l]][i[j / s[l] % 3]]; } ret = min(ret, cur); } } cout << ret << 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...