제출 #526305

#제출 시각아이디문제언어결과실행 시간메모리
526305wai_hoang_0912Cities (BOI16_cities)C++17
100 / 100
2028 ms45620 KiB
#include <bits/stdc++.h> using namespace std; #define FORU(i, a, b) for(__typeof(b) i = a; i <= b; i ++) #define FORD(i, b, a) for(__typeof(b) i = b; i >= a; i --) #define UFOR(i, a, b) for(__typeof(b) i = a; i < b; i ++) #define DFOR(i, b, a) for(__typeof(b) i = b; i > a; i --) #define N 100005 #define oo 1000000000000000 #define pb push_back #define fi first #define se second #define ll long long typedef pair < ll, int > ii; int n, k, m, s[8]; ll f[1 << 8][N]; vector < ii > a[N]; void read() { cin >> n >> k >> m; FORU(i, 1, k) cin >> s[i]; int u, v; ll c; FORU(i, 1, m) { cin >> u >> v >> c; a[u].pb(ii(c, v)); a[v].pb(ii(c, u)); } } void Dijkstra(int mask) { priority_queue < ii, vector < ii >, greater < ii > > q; FORU(i, 1, n) if(f[mask][i] != oo) q.push(ii(f[mask][i], i)); while(!q.empty()) { int u = q.top().se; ll du = q.top().fi; q.pop(); if(du != f[mask][u]) continue; UFOR(i, 0, a[u].size()) { int v = a[u][i].se; ll uv = a[u][i].fi; if(f[mask][v] > f[mask][u] + uv) { f[mask][v] = f[mask][u] + uv; q.push(ii(f[mask][v], v)); } } } } void solve() { FORU(i, 0, 1 << k) FORU(j, 1, n) f[i][j] = oo; FORU(i, 1, k) f[1 << (i - 1)][s[i]] = 0; UFOR(x, 1, 1 << k) { UFOR(y, 0, x) { if((x | y) != x) continue; int z = x ^ y; if(y > z) continue; FORU(i, 1, n) f[x][i] = min(f[x][i], f[y][i] + f[z][i]); } Dijkstra(x); } ll res = oo; FORU(i, 1, n) res = min(res, f[(1 << k) - 1][i]); if(res == oo) cout << -1; else cout << res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); read(); solve(); 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...