Cod sursa(job #2671576)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 12 noiembrie 2020 13:05:50
Problema PScNv Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 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;
};

int que[2500001];
bool used[250001];
vector < Edge > gr[250001];

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

  bool can = false;

  que[0] = x;
  int front = 0, back = 1;
  used[x] = true;

  while (que[front] != -1) {
    int cur = que[front ++];

    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;
        que[back ++] = edge.nei;
      }
    }
  }

  memset(&used, 0, 250001);
  memset(&que, -1, (back + 1) * 4);
  return can;
}

int main() {

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

  ios::sync_with_stdio(false);
  fin.tie(0);fout.tie(0);

  memset(&que, -1, 1e6 + 4);

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

  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) >> 1;

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

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