Cod sursa(job #788364)

Utilizator vendettaSalajan Razvan vendetta Data 14 septembrie 2012 16:39:57
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#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;

}