int n, m, k; int f[kMaxN][kMaxS], id[kMaxN]; std::vector<std::pair<int, int>> G[kMaxN];
voiddijkstra(int s){ staticbool vis[kMaxN]; std::priority_queue<std::pair<int, int>> q; for (int i = 1; i <= n; ++i) q.emplace(-f[i][s], i), vis[i] = 0; for (; !q.empty();) { int u = q.top().second; q.pop(); if (vis[u]) continue; vis[u] = 1; for (auto [v, w] : G[u]) { if (f[v][s] > f[u][s] + w) { f[v][s] = f[u][s] + w; q.emplace(-f[v][s], v); } } } }
voidsolve(){ memset(f, 0x3f, sizeof(f)); for (int i = 1; i <= n; ++i) f[i][id[i] ? (1 << (id[i] - 1)) : 0] = 0; for (int s = 0; s < (1 << k); ++s) { for (int i = 1; i <= n; ++i) { for (int t = s; t; t = (t - 1) & s) f[i][s] = std::min(f[i][s], f[i][s ^ t] + f[i][t]); } dijkstra(s); } }
voiddickdreamer(){ std::cin >> n >> m >> k; for (int i = 1; i <= m; ++i) { int u, v, w; std::cin >> u >> v >> w; G[u].emplace_back(v, w), G[v].emplace_back(u, w); } for (int i = 1; i <= k; ++i) { int x; std::cin >> x; id[x] = i; } solve(); int ans = 1e9; for (int i = 1; i <= n; ++i) ans = std::min(ans, f[i][(1 << k) - 1]); std::cout << ans << '\n'; }