提交时间:2025-04-06 17:02:25
运行 ID: 37579
#include <bits/stdc++.h> #define int long long using namespace std; int n,m,k; int s[100005],g[100005],dis[100005],f[100005]; bool b[100005],vis[100005]; int ans[100005]; vector <pair <int,int>> e[100005]; int fd (int x) { if (f[x] == x || b[x]) { return x; } f[x] = fd(f[x]); return f[x]; } signed main () { // freopen("query.in","r",stdin); // freopen("query.out","w",stdout); cin >> n >> m >> k; for (int i = 1;i <= k;i++) { cin >> s[i]; b[s[i]] = 1; } sort (s + 1,s + k + 1); for (int i = 1;i <= m;i++) { int u,v,w; cin >> u >> v >> w; e[v].push_back(make_pair(u,w)); } for (int i = 1;i <= n;i++) { cin >> g[i]; } for (int i = 1;i <= n;i++) { dis[i] = 1e18; ans[i] = 1e18; f[i] = i; } for (int i = 1;i <= n;i++) { sort(e[i].begin(),e[i].end()); } priority_queue <pair <int,int>> q; for (int i = 1;i <= k;i++) { dis[s[i]] = 0; q.push(make_pair(0,s[i])); } while (!q.empty()) { int u = q.top().second; q.pop(); if (vis[u]) { continue; } vis[u] = 1; for (auto at : e[u]) { int v = at.first,w = at.second; fd(v); if (b[v] && f[u] != v) { ans[v] = min(ans[v],dis[u] + w); } if (dis[v] == dis[u] + w && f[v] != f[u]) { f[v] = 0; } if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; f[v] = u; q.push(make_pair(-dis[v],v)); } } } for (int i = 1;i <= n;i++) { if (b[i]) { cout << ans[i] * g[i] << ' '; } else { cout << dis[i] * g[i] << ' '; } } return 0; }