Cod sursa(job #2671566)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 12 noiembrie 2020 12:53:14
Problema PScNv Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
// By Stefan Radu

#include <bits/stdc++.h>

using namespace std;

#define sz(x) (int)(x).size()

typedef pair < int, int > pii;
typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;

ifstream fin("pscnv.in");
ofstream fout("pscnv.out");

struct Edge {
  int nei, weight;
};

vector < bool > used;
vector < vector < Edge > > gr;

int can(int x, int y, int k) {

  bool can = false;
  queue < int > q;

  q.push(x);
  used[x] = true;

  while (not q.empty()) {
    int cur = q.front();
    q.pop();

    if (cur == y) {
      can = true;
      break;
    }

    for (auto edge : gr[cur]) {
      if (used[edge.nei]) continue;

      if (edge.weight <= k and not used[edge.nei]) {
        used[edge.nei] = true;
        q.push(edge.nei);
      }
    }
  }

  fill(used.begin(), used.end(), false);
  return can;
}

int main() {

#ifdef STEF
  freopen("input", "r", stdin);
  freopen("output", "w", stdout);
#endif

  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);


  int n, m, x, y;
  fin >> n >> m >> x >> y;

  gr.resize(n + 1);
  used.resize(n + 1);
  for (int i = 1; i <= m; ++ i) {
    int a, b, c;
    fin >> a >> b >> c;
    gr[a].push_back({b, c});
  }

  int st = 1, dr = 1000, sol = -1;
  while (st <= dr) {
    int mid = (st + dr) / 2;

    if (can(x, y, mid)) {
      sol = mid;
      dr = mid - 1;
    }
    else {
      st = mid + 1;
    }
  }

  fout << sol << '\n';
}