提交时间:2025-04-06 15:45:28

运行 ID: 37561

#include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define mk make_pair #define ll long long #define ldb long double #define bi __int128_t using namespace std; const int N=1e5+10; ll d[N]; bool vis[N],in[N]; vector<pii> E[N]; int n,m,k; void dij(vector<int> S){ for(int i=1;i<=n;i++) d[i]=1e18; memset(vis,0,sizeof(vis)); priority_queue<pair<ll,int>> q; for(auto ed:S) d[ed]=0,q.push(mk(0,ed)); while(!q.empty()){ pair<ll,int> p=q.top();q.pop(); int u=p.se; if(vis[u]) continue; vis[u]=1; for(auto ed:E[u]){ int v=ed.fi,w=ed.se; if(d[u]+w<d[v]){ d[v]=d[u]+w; q.push(mk(-d[v],v)); } } } } ll f[N]; int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m>>k; for(int i=1;i<=k;i++){ int x;cin>>x;in[x]=1; }for(int i=1;i<=m;i++){ int u,v,w;cin>>u>>v>>w; //E[u].push_back(mk(v,w)); E[v].push_back(mk(u,w)); } for(int i=1;i<=n;i++) f[i]=1e18; for(int i=0;i<=20;i++){ vector<int> b0,b1; for(int j=1;j<=n;j++){ if((j>>i)&1) b1.push_back(j); else b0.push_back(j); }vector<int> S; S.clear(); for(auto ed:b0) if(in[ed]) S.push_back(ed); dij(S); for(auto ed:b1) f[ed]=min(f[ed],d[ed]);//,cout<<i<<' '<<ed<<' '<<d[ed]<<endl; S.clear(); for(auto ed:b1) if(in[ed]) S.push_back(ed); dij(S); for(auto ed:b0) f[ed]=min(f[ed],d[ed]);//,cout<<i<<' '<<ed<<' '<<d[ed]<<endl; }for(int i=1;i<=n;i++){ int op;cin>>op;cout<<f[i]*op<<' '; }cout.flush(); return 0; }