比赛 20150422 评测结果 AAAAAAAAAAA
题目名称 背驮式行走 最终得分 100
用户昵称 new ioer 运行时间 0.105 s
代码语言 C++ 内存使用 1.42 MiB
提交时间 2015-04-22 09:13:22
显示代码纯文本
#include<deque>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool vis[40001];
int B,E,P,N,M,len,ans,g[40001],to[80001],next[80001],dis[40001][3];
void in(int &x){
    int ch;
    while((ch=getchar())<48);x=ch-48;
    while((ch=getchar())>47) x=x*10+ch-48;
}
void add(int x,int y){
    to[++len]=y,next[len]=g[x],g[x]=len;
}
void spfa(int s){
    deque <int> q;
    if(s==N) s=dis[N][0]=0,q.push_back(N);
    else q.push_back(s),dis[s][s]=0;
    while(!q.empty()){
        int x=q.front();
        q.pop_front(),vis[x]=0;
        for(int t,i=g[x];i;i=next[i])
            if(dis[t=to[i]][s]>dis[x][s]+1){
                dis[t][s]=dis[x][s]+1;
                if(!vis[t]){
                    vis[t]=1;
                    if(q.empty()||dis[t]<dis[q.front()]) q.push_front(t);
                    else q.push_back(t);
                }
            }
    }
}
int main(){
	freopen("piggyback.in","r",stdin);
	freopen("piggyback.out","w",stdout);
    in(B),in(E),in(P),in(N),in(M);
    for(int x,y;M--;) in(x),in(y),add(x,y),add(y,x);
    memset(dis,0x3f,sizeof dis);
    spfa(1),spfa(2),spfa(N),ans=0x7fffffff;
    for(int i=1;i<=N;i++) ans=min(ans,dis[i][1]*B+dis[i][2]*E+dis[i][0]*P);
    printf("%d",ans);
}