Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37566 | 22fhq | 【S】T2 | C++ | 通过 | 100 | 1387 MS | 65876 KB | 1963 | 2025-04-06 15:49:18 |
#include<bits/stdc++.h> #define int long long using namespace std; template<typename T> inline void read(T &x){x=0;char c=getchar();bool neg=0;while(!isdigit(c)){if(c=='-')neg=1;c=getchar();}while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();if(neg)x=-x;} #define read2(a,b) read(a),read(b) #define read3(a,b,c) read2(a,b),read(c) #define read4(a,b,c,d) read3(a,b,c),read(d) #define read5(a,b,c,d,e) read4(a,b,c,d),read(e) #define read6(a,b,c,d,e,f) read5(a,b,c,d,e),read(f) int n,m,k,s[100005],f[100005],g[100005]; vector<pair<int,int>>e[100005]; int dis[100005]; bool vis[100005]; void dij(vector<int>&v){ priority_queue<pair<int,int>>q; for(int i=1;i<=n;i++)dis[i]=1e18,vis[i]=0; for(int x:v)dis[x]=0,q.push({0,x}); while(q.size()){ int p=q.top().second; q.pop(); if(vis[p])continue; vis[p]=1; for(auto [x,w]:e[p]){ if(dis[p]+w<dis[x]){ dis[x]=dis[p]+w; q.push({-dis[x],x}); } } } } bool ins[100005]; void slv(){ // cout<<(1<<-1)<<endl; read3(n,m,k); for(int i=1;i<=k;i++){ read(s[i]); ins[s[i]]=1; } for(int i=1;i<=m;i++){ int x,y,z; read3(x,y,z); e[y].push_back({x,z}); } for(int i=1;i<=n;i++)read(g[i]),f[i]=1e18; vector<int>p1,p0; for(int i=0;(1<<i)<=(n<<1);i++){ p0.clear(),p1.clear(); for(int j=1;j<=k;j++){ if(s[j]>>i&1)p1.push_back(s[j]); else p0.push_back(s[j]); } dij(p0); for(int j=1;j<=n;j++){ if((j>>i&1)||!ins[j])f[j]=min(f[j],dis[j]); } dij(p1); for(int j=1;j<=n;j++){ if(!(j>>i&1)||!ins[j])f[j]=min(f[j],dis[j]); } } for(int i=1;i<=n;i++)cout<<f[i]*g[i]<<" "; return; } signed main(){ // int T;read(T);while(T--) slv(); return 0; }