出题人脑洞好大…
题解参考
#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define rep2(i,k,n) for(int i=k;i>=n;i--)
#define E1(x,i) for(int i=e1.head[x];i;i=e1.edge[i].next)
#define E2(x,i) for(int i=e2.head[x];i;i=e2.edge[i].next)
using namespace std;
const int N=2e5+7;
struct Edge{
struct E{
int to,pre,next;E(int to=0,int pre=0,int next=0):to(to),pre(pre),next(next){}
}edge[N<<1];
int head[N],tot;
Edge(){tot=0;}
void add(int x,int y){
edge[head[x]].pre=++tot;edge[tot]=E(y,0,head[x]);head[x]=tot;
edge[head[y]].pre=++tot;edge[tot]=E(x,0,head[y]);head[y]=tot;
}
void del(int i,int x){
if(i==head[x])head[x]=edge[i].next;
if(edge[i].pre)edge[edge[i].pre].next=edge[i].next;
if(edge[i].next)edge[edge[i].next].pre=edge[i].pre;
}
}e1,e2;
queue<int> Q;
int vis[N],d[N],ans[N],n,m,S,a,b;
int main(){
scanf("%d%d%d%d%d",&n,&m,&S,&a,&b);
int x,y;
rep(i,1,m){scanf("%d%d",&x,&y);e1.add(x,y),e2.add(x,y);}
d[S]=0;vis[S]=1;
Q.push(S);
while(!Q.empty()){
int u=Q.front();Q.pop();
E1(u,i){int v=e1.edge[i].to;
if(!vis[v]){Q.push(v);vis[v]=1;d[v]=d[u]+1;}
}
}rep(i,1,n)ans[i]=min(d[i]*a,(d[i]>>1)*b+(d[i]&1)*a);
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
Q.push(S);
while(!Q.empty()){
int u=Q.front();Q.pop();
E1(u,i){int v=e1.edge[i].to;vis[v]=1;}
E1(u,i){int v=e1.edge[i].to;
E2(v,j){
int k=e2.edge[j].to;
if(d[k] || vis[k] || k==S)continue;
Q.push(k);d[k]=d[u]+1;
e2.del(j,v);
}
}
E1(u,i){int v=e1.edge[i].to;vis[v]=0;}
}
rep(i,1,n)if(d[i])ans[i]=min(ans[i],d[i]*b);
rep(i,1,n){printf("%d\n",ans[i]);
}
}