@2023gdgz01
代码如下:
#include<bits/stdc++.h>
#define inf 91145141919810
#define int long long
using namespace std;
const int MAXN = 1e6 + 10 , MAXM = MAXN << 1;
int n , m , k , s;
int p , pp;
int z[MAXN];
int he[MAXN] , to[MAXM] , ne[MAXM];
int idx;
int dis[MAXN];
bool flag[MAXN] , vis[MAXN] , safe[MAXN];
inline int read() {
char c = getchar();
int x = 0 , s = 1;
while(c < '0' || c > '9') {
if(c == '-')
s = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * s;
}
inline void add(int a , int b) {
to[++ idx] = b;
ne[idx] = he[a];
he[a] = idx;
return;
}
inline void bfs(int u , int s) {
queue<pair<int , int> >q;
q.push(make_pair(u , 0));
while(!q.empty()) {
int u = q.front().first;
int t = q.front().second;
q.pop();
if(t == s)
continue;
for(int i = he[u];i;i = ne[i]) {
if(!safe[to[i]]) {
safe[to[i]] = true;
q.push(make_pair(to[i] , t + 1));
}
}
}
return;
}
inline void dijkstra() {
memset(vis , false , sizeof(vis));
for(int i = 1;i <= n;i ++)
dis[i]= inf;
priority_queue<pair<int , int> , vector<pair<int , int> > , greater<pair<int , int> > >q;
dis[1] = 0;
q.push(make_pair(0 , 1));
while(!q.empty()) {
int u = q.top().second;
q.pop();
if(vis[u])
continue;
vis[u] = true;
for(int i = he[u];i;i = ne[i]) {
int x = to[i];
if(flag[x])
continue;
if(safe[x]) {
if(dis[u] + pp < dis[x]) {
dis[x] = dis[u] + pp;
q.push(make_pair(dis[x] , x));
}
}
else {
if(dis[u] + p < dis[x]) {
dis[x] = dis[u] + p;
q.push(make_pair(dis[x] , x));
}
}
}
}
return;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
n = read();
m = read();
k = read();
s = read();
p = read();
pp = read();
for(int i = 1;i <= k;i ++) {
z[i] = read();
flag[z[i]] = true;
}
for(int i = 1;i <= m;i ++) {
int a , b;
a = read();
b = read();
add(a , b);
add(b , a);
}
for(int i = 1;i <= k;i ++)
bfs(z[i] , s);
// for(int i = 1;i <= n;i ++)
// cout << safe[i] << " ";
// cout << '\n';
dijkstra();
if(safe[n])
dis[n] -= pp;
else
dis[n] -= p;
cout << dis[n];
return 0;
}