Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37573 22级廖思学 【S】T2 C++ 通过 100 1748 MS 13096 KB 2436 2025-04-06 15:54:59

Tests(140/140):


#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second const int N=3e5+10,inf=1e18; int n,m,k,s[N],g[N],f[N],dis[N]; struct Edge{int v,w,nx;}e[N];int CNT,h[N]; void add(int u,int v,int w){e[++CNT]={v,w,h[u]};h[u]=CNT;} bool vis[N]; priority_queue<pii>q; void dij(){ // cout<<"--------------------------------"<<endl; while(!q.empty()){ int u=q.top().sc;q.pop(); if(vis[u])continue;vis[u]=1; int v,w;//cout<<"??"<<u<<endl; for(int i=h[u];i>0;i=e[i].nx){ v=e[i].v;w=e[i].w;//cout<<v<<" "<<w<<" "<<dis[u]<<" "<<dis[v]<<endl; if(dis[u]+w<dis[v]){ dis[v]=dis[u]+w; q.push({-dis[v],v}); } } } // cout<<"<<<<<----------------------------"<<endl; } signed main(){ scanf("%lld%lld%lld",&n,&m,&k); for(int i=1;i<=n;i++)f[i]=inf; for(int i=1;i<=k;i++)scanf("%lld",&s[i]); for(int i=1;i<=m;i++){ int u,v,w; scanf("%lld%lld%lld",&u,&v,&w); add(v,u,w);//建反图 // cout<<v<<" "<<u<<" "<<w<<endl; } for(int i=1;i<=n;i++)scanf("%lld",&g[i]); for(int i=1;i<=n;i++){dis[i]=inf;vis[i]=0;} for(int i=1;i<=k;i++){dis[s[i]]=0;q.push({0,s[i]});} dij(); for(int i=1;i<=n;i++){if(dis[i])f[i]=dis[i];/*cout<<f[i]<<" ";*/}//cout<<endl; int p=__lg(n); for(int j=0;j<=p;j++){ // cout<<"!!!"<<j<<endl; //以二进制第i位为1的为源点,向二进制第i位为0的跑dij for(int i=1;i<=n;i++){dis[i]=inf;vis[i]=0;} for(int i=1;i<=k;i++){ if(s[i]&(1<<j)){dis[s[i]]=0;q.push({0,s[i]});/*cout<<s[i]<<" ";*/} }//cout<<endl; dij(); // for(int i=1;i<=n;i++)cout<<dis[i]<<" ";cout<<endl; for(int i=1;i<=k;i++){ if(!(s[i]&(1<<j))){f[s[i]]=min(f[s[i]],dis[s[i]]);} } //以二进制第i位为0的为源点,向二进制第i位为1的跑dij for(int i=1;i<=n;i++){dis[i]=inf;vis[i]=0;} for(int i=1;i<=k;i++){ if(!(s[i]&(1<<j))){dis[s[i]]=0;q.push({0,s[i]});} } dij(); for(int i=1;i<=k;i++){ if(s[i]&(1<<j)){f[s[i]]=min(f[s[i]],dis[s[i]]);} } } for(int i=1;i<=n;i++){printf("%lld ",f[i]*g[i]);/*cout<<f[i]<<" ";*/}//cout<<endl; return 0; }


测评信息: