提交时间:2025-04-06 15:21:49
运行 ID: 37551
// Author: Aquizahv #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5 + 5, M = 3e5 + 5; int n, m, k, g[N]; vector<int> S, T; bool mark[N]; int head[N], pos; struct Edge { int u, v, w, nxt; } e[M]; ll ans[N]; void addEdge(int u, int v, int w) { e[++pos] = {u, v, w, head[u]}; head[u] = pos; } struct dij { int u; ll dis; bool operator<(const dij t) const { return dis > t.dis; } }; ll dis[N]; bool vis[N]; void dijkstra() { // for (auto u : T) // cout << u << ' '; // cout << endl; priority_queue<dij> q; memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); for (auto u : T) q.push({u, 0}), dis[u] = 0; while (!q.empty()) { int u = q.top().u; q.pop(); if (vis[u]) continue; vis[u] = true; for (int i = head[u]; i; i = e[i].nxt) if (dis[e[i].v] > dis[u] + e[i].w) { dis[e[i].v] = dis[u] + e[i].w; q.push({e[i].v, dis[e[i].v]}); } } for (int i = 1; i <= n; i++) if (dis[i] != 0) ans[i] = min(ans[i], dis[i]); } int main() { cin >> n >> m >> k; int u, v, w; for (int i = 1; i <= k; i++) scanf("%d", &u), S.push_back(u); for (int i = 1; i <= m; i++) scanf("%d%d%d", &u, &v, &w), addEdge(v, u, w); for (int i = 1; i <= n; i++) ans[i] = 1e18; T = S; dijkstra(); // for (int k = 0; k < 18; k++) for (auto v : S) { T.clear(); // for (auto u : S) // if ((u >> k) & 1) // T.push_back(u); for (auto u : S) if (u == v) T.push_back(u); dijkstra(); } for (int i = 1; i <= n; i++) { scanf("%d", g + i); printf("%lld%c", ans[i] * g[i], " \n"[i == n]); } return 0; }