Problem p00546 (C++) — buggy submission, verdict: Time Limit Exceeded

/* template.cpp [[[ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...)                                                              \\
  get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)s)
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b)-1; i >= (ll)(a); i -= (ll)s)
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template <class T, class U> void chmin(T &x, const U &y) { x = min<T>(x, y); }
template <class T, class U> void chmax(T &x, const U &y) { x = max<T>(x, y); }
struct prepare_ {
  prepare_() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
  }
} prepare__;
/* ]]] */

int n, m, k, s;
int p, q;
int x[100000];
ll c[100000];
vector<int> g[100000];
ll d[100000];

int main() {
  cin >> n >> m >> k >> s;
  cin >> p >> q;
  rep(i, k) cin >> x[i];
  rep(i, m) {
    int a, b;
    cin >> a >> b;
    g[a - 1].push_back(b - 1);
    g[b - 1].push_back(a - 1);
  }

  fill_n(d, 100000, inf_ll);
  queue<int> qu;
  rep(i, k) {
    d[x[i] - 1] = 0;
    qu.push(x[i] - 1);
  }
  while (qu.size()) {
    int v = qu.front();
    qu.pop();
    each(u, g[v]) {
      if (d[u] == inf_ll) {
        d[u] = d[v] + 1;
        qu.push(u);
      }
    }
  }

  rep(i, 1, n - 1) {
    if (d[i] == 0)
      c[i] = inf_ll;
    else if (d[i] <= s)
      c[i] = q;
    else
      c[i] = p;
  }

  priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>>
      pq;
  fill_n(d, 100000, inf_ll);
  d[0] = 0;
  pq.emplace(0, 0);
  while (pq.size()) {
    ll sm;
    int v;
    tie(sm, v) = pq.top();
    pq.pop();
    if (d[v] < sm)
      continue;
    each(u, g[v]) {
      if (d[u] > sm + c[u]) {
        d[u] = sm + c[u];
        pq.emplace(sm + c[u], u);
      }
    }
  }

  cout << d[n - 1] << endl;
}

Error: TLE

Fixed submission:

/* template.cpp [[[ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...)                                                              \\
  get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)s)
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b)-1; i >= (ll)(a); i -= (ll)s)
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template <class T, class U> void chmin(T &x, const U &y) { x = min<T>(x, y); }
template <class T, class U> void chmax(T &x, const U &y) { x = max<T>(x, y); }
struct prepare_ {
  prepare_() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
  }
} prepare__;
/* ]]] */

int n, m, k, s;
int p, q;
int x[100000];
ll c[100000];
vector<int> g[100000];
ll d[100000];

int main() {
  cin >> n >> m >> k >> s;
  cin >> p >> q;
  rep(i, k) cin >> x[i];
  rep(i, m) {
    int a, b;
    cin >> a >> b;
    g[a - 1].push_back(b - 1);
    g[b - 1].push_back(a - 1);
  }

  fill_n(d, 100000, inf_ll);
  queue<int> qu;
  rep(i, k) {
    d[x[i] - 1] = 0;
    qu.push(x[i] - 1);
  }
  while (qu.size()) {
    int v = qu.front();
    qu.pop();
    each(u, g[v]) {
      if (d[u] == inf_ll) {
        d[u] = d[v] + 1;
        qu.push(u);
      }
    }
  }

  rep(i, 1, n - 1) {
    if (d[i] == 0)
      c[i] = inf_ll;
    else if (d[i] <= s)
      c[i] = q;
    else
      c[i] = p;
  }

  priority_queue<pair<ll, int>> pq;
  fill_n(d, 100000, inf_ll);
  d[0] = 0;
  pq.emplace(0, 0);
  while (pq.size()) {
    ll sm;
    int v;
    tie(sm, v) = pq.top();
    pq.pop();
    if (d[v] < sm)
      continue;
    each(u, g[v]) {
      if (d[u] > sm + c[u]) {
        d[u] = sm + c[u];
        pq.emplace(sm + c[u], u);
      }
    }
  }

  cout << d[n - 1] << endl;
}