Pagini recente » Cod sursa (job #2315359) | Cod sursa (job #378054) | Cod sursa (job #1220031) | Cod sursa (job #1064416) | Cod sursa (job #788364)
Cod sursa(job #788364)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("pscnv.in");
ofstream g("pscnv.out");
#define nmax 250005
#define ll long long
#define Cifmax 5000000
char S[Cifmax];
int poz = 0;
int n, m, X, Y;
set<pair<int,int> > gf[nmax];
bool viz[nmax];
void buf(int &nr){
nr = 0;
for(; S[poz]<'0' || S[poz]>'9'; poz++);
for(; S[poz]>='0' && S[poz]<='9'; ++poz){
nr = nr * 10 + (S[poz] - '0');
}
}
void citeste(){
f.getline(S, Cifmax, EOF);
buf(n); buf(m); buf(X); buf(Y);
for(int i=1; i<=m; ++i){
int x, y, k;
buf(x); buf(y); buf(k);
gf[x].insert( make_pair(k,y) );
}
}
bool check(int Val){
queue<int> Q;
for(; Q.size(); Q.pop());
for(int i=0; i<=n; ++i) viz[i] = 0;
viz[X] = 1;
Q.push(X);
for(; Q.size(); ){
int nod = Q.front();
Q.pop();
for(set<pair<int,int> >::iterator it=gf[nod].begin(); it!=gf[nod].end(); ++it){
int pondere = (*it).first;
int vc = (*it).second;
if (viz[vc] == 1) continue;
if (pondere <= Val){
viz[vc] = 1;
Q.push(vc);
}
}
}
if (viz[Y] == 1) return 1;
return 0;
}
void rezolva(){
//caut binar raspunsul
int st = 0;
int dr = 1001;
while(dr - st > 1){
int mij = (st + dr) / 2;
if (check(mij) > 0 ){
dr = mij;
}else st = mij;
}
g << dr << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}