제출 #570355

#제출 시각아이디문제언어결과실행 시간메모리
570355SSRSEvacuation plan (IZhO18_plan)C++14
19 / 100
834 ms22536 KiB
#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
int main(){
  int n, m;
  cin >> n >> m;
  vector<vector<pair<int, int>>> E(n);
  for (int i = 0; i < m; i++){
    int a, b, w;
    cin >> a >> b >> w;
    a--;
    b--;
    E[a].push_back(make_pair(w, b));
    E[b].push_back(make_pair(w, a));
  }
  int k;
  cin >> k;
  vector<int> g(k);
  for (int i = 0; i < k; i++){
    cin >> g[i];
    g[i]--;
  }
  vector<int> d(n, -1);
  priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
  for (int i = 0; i < k; i++){
    pq.push(make_pair(0, g[i]));
  }
  while (!pq.empty()){
    int c = pq.top().first;
    int v = pq.top().second;
    pq.pop();
    if (d[v] == -1){
      d[v] = c;
      for (auto P : E[v]){
        int w = P.second;
        if (d[w] == -1){
          pq.push(make_pair(c + P.first, w));
        }
      }
    }
  }
  int Q;
  cin >> Q;
  int s, t;
  cin >> s >> t;
  s--;
  t--;
  int tv = 0, fv = INF;
  while (fv - tv > 1){
    int mid = (tv + fv) / 2;
    if (d[s] < mid){
      fv = mid;
    } else {
      vector<bool> used(n, false);
      used[s] = true;
      queue<int> q;
      q.push(s);
      while (!q.empty()){
        int v = q.front();
        q.pop();
        for (auto P : E[v]){
          int w = P.second;
          if (d[w] >= mid && !used[w]){
            used[w] = true;
            q.push(w);
          }
        }
      }
      if (used[t]){
        tv = mid;
      } else {
        fv = mid;
      }
    }
  }
  cout << tv << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...