http://icpc.upc.edu.cn/problem.php?id=2412
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1000005;
struct node{
int t,n;
}E[maxn];
queue<int>q;
int t,n,e,m,i,j,k,x,y,d[4][maxn],h[maxn],v[maxn],ans=100000000,p,b;
void add(int u,int v) {
t++;
E[t].t=v;
E[t].n=h[u];
h[u]=t;
}
void spfa(int x,int k) {
memset(v,0,sizeof(v));
q.push(x);
v[x]=1;
d[k][x]=0;
while(q.size()) {
int u=q.front();
q.pop();
v[u]=0;
for (int i=h[u]; i; i=E[i].n) {
int v1=E[i].t;
if (d[k][v1]>d[k][u]+1) {
d[k][v1]=d[k][u]+1;
if (v[v1]==0) {
v[v1]=1;
q.push(v1);
}
}
}
}
}
int main() {
memset(d,0x3f,sizeof(d));
scanf("%d%d%d%d%d",&b,&e,&p,&n,&m);
for (i=1; i<=m; i++) {
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
spfa(1,0);
spfa(2,1);
spfa(n,2);
for(i=1; i<=n; i++)
ans=min(ans,b*d[0][i]+e*d[1][i]+p*d[2][i]);
printf("%d\n",ans);
}