3415: Poi2013 Price List

来源:互联网 发布:索尔仁尼琴 知乎 编辑:程序博客网 时间:2024/03/28 18:18

出题人脑洞好大…
题解参考

#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]);    }}
0 0
原创粉丝点击