AtCoder-abc277_e.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include <deque>
  2. #include <iostream>
  3. #include <limits>
  4. #include <utility>
  5. #include <vector>
  6. using namespace std;
  7. struct Edge { int to, cost; };
  8. int main() {
  9. ios::sync_with_stdio(false);
  10. cin.tie(nullptr);
  11. int n, m, k; cin >> n >> m >> k;
  12. auto id = [n](int v, int mode) { return v + mode * n; };
  13. vector<vector<Edge>> g(2 * n);
  14. for (int i = 0; i < m; ++i) {
  15. int u, v, a; cin >> u >> v >> a; --u; --v;
  16. g[id(u, a)].push_back({id(v, a), 1});
  17. g[id(v, a)].push_back({id(u, a), 1});
  18. }
  19. for (int i = 0; i < k; ++i) {
  20. int v; cin >> v; --v;
  21. g[id(v, 0)].push_back({id(v, 1), 0});
  22. g[id(v, 1)].push_back({id(v, 0), 0});
  23. }
  24. const int inf = numeric_limits<int>::max() / 4;
  25. vector<int> dist(2 * n, inf); vector<bool> done(2 * n, false); deque<int> dq;
  26. dist[id(0, 1)] = 0; dq.push_front(id(0, 1));
  27. while (!dq.empty()) {
  28. int u = dq.front(); dq.pop_front();
  29. if (done[u]) continue;
  30. done[u] = true;
  31. for (Edge e : g[u]) if (dist[e.to] > dist[u] + e.cost) {
  32. dist[e.to] = dist[u] + e.cost;
  33. if (e.cost == 0) dq.push_front(e.to); else dq.push_back(e.to);
  34. }
  35. }
  36. int answer = min(dist[id(n - 1, 0)], dist[id(n - 1, 1)]);
  37. cout << (answer == inf ? -1 : answer) << '\n';
  38. }