#include<bits/stdc++.h>
using namespace std;
const long long MX_N=501000,MX_M=501000,INF=0x3f3f3f3f3f3f3f3f;
const long long tim=100;
struct node{
long long to,next;
long long w,cost;
}edge[MX_M<<1];
long long head[MX_N]={0},edge_cnt=0;
inline void Add(long long x,long long y,long long w,long long c){
node& it=edge[edge_cnt];
it.cost=c;it.next=head[x];it.w=w;it.to=y;
head[x]=edge_cnt++;
}
inline void add(long long x,long long y,long long w,long long c){
Add(x,y,w,c),Add(y,x,0,-c);
}
long long s=0,t=MX_N-1;
long long pre[MX_N]={0},lim[MX_N]={0},dist[MX_N]={0};
bool vis[MX_N]={0};
bool spfa(){
for(long long i=0;i<MX_N;i++) lim[i]=0,vis[i]=0,dist[i]=INF;
queue<long long >qu;
qu.push(s);lim[s]=INF,vis[s]=1,dist[s]=0;
while(!qu.empty()){
long long now=qu.front();qu.pop();vis[now]=0;
// printf("now %lld\n",now);
for(long long i=head[now];~i;i=edge[i].next){
long long to=edge[i].to,w=edge[i].w,cost=edge[i].cost;
if(w&&dist[to]>dist[now]+cost){
dist[to]=dist[now]+cost;
pre[to]=i;
lim[to]=min(lim[now],w);
if(!vis[to]){
qu.push(to);
vis[to]=1;
}
}
}
}
return lim[t]>0;
}
void EK(long long &flow,long long &cost){
flow=cost=0;
while(spfa()){
flow+=lim[t];
cost+=lim[t]*dist[t];
for(long long i=t;i!=s;i=edge[pre[i]^1].to){
edge[pre[i]].w-=lim[t];
edge[pre[i]^1].w+=lim[t];
}
}
}
long long n,m,k,c,d;
inline long long has(long long now,long long tim){
return tim*n+now;
}
signed main(){
memset(head,-1,sizeof(head));
scanf("%lld%lld%lld%lld%lld",&n,&m,&k,&c,&d);
long long sum=0;
for(long long i=1;i<=k;i++){
long long ai;scanf("%lld",&ai);
sum+=ai;
add(s,has(ai,0),1,0);
}
for(long long i=1;i<=m;i++){
long long u,v;scanf("%lld%lld",&u,&v);
for(long long j=0;j<=tim;j++){
for(long long x=1;x<=sum;x+=2){
add(has(u,j),has(v,j+1),1,d*x);
add(has(v,j),has(u,j+1),1,d*x);
}
}
}
for(long long i=1;i<=n;i++){
for(long long j=0;j<tim;j++){
add(has(i,j),has(i,j+1),INF,0);
}
}
for(long long j=0;j<=tim;j++) add(has(1,j),t,INF,c*j);
long long flow=0,cost=0;
EK(flow,cost);
printf("%lld",cost);
return 0;
}//CF1187G
数据:
50 49 49 1 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50