Cod sursa(job #1659776)

Utilizator Athena99Anghel Anca Athena99 Data 22 martie 2016 16:33:39
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

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

const int inf= 1<<30;
const int nmax= 250000;
const int kmax= 1000;

string buffer;
string::iterator buffer_it;

void read_int_nn( int &x ) {
    for ( ; *buffer_it<'0' || *buffer_it>'9'; ++buffer_it ) ;
    for ( x= 0; *buffer_it>='0' && *buffer_it<='9'; ++buffer_it ) {
        x= x*10+*buffer_it-'0';
    }
}

bool u[nmax+1];
int d[nmax+1];

struct str {
    int x, y;
};

vector <int> dist[kmax+1];
vector <str> g[nmax+1];

inline str mp( int x, int y ) {
    str sol;
    sol.x= x, sol.y= y;

    return sol;
}

void dijkstra( int x ) {
    d[x]= 0;
    dist[0].push_back(x);
    for ( int i= 0; i<=kmax; ++i ) {
        for ( int j= 0, it; j<(int)dist[i].size(); ++j ) {
            it= dist[i][j];
            if ( d[it]>=i ) {
                for ( vector <str>::iterator jt= g[it].begin(); jt!=g[it].end(); ++jt ) {
                    if ( max(i, (*jt).y)<d[(*jt).x] ) {
                        d[(*jt).x]= max(i, (*jt).y);
                        dist[max(i, (*jt).y)].push_back((*jt).x);
                    }
                }
            }
        }
    }
}

int main(  ) {
    getline ( fin, buffer, (char)0 );
    buffer_it= buffer.begin();

    int n, m, x, y;
    read_int_nn(n), read_int_nn(m), read_int_nn(x), read_int_nn(y);
    for ( int i= 1; i<=m; ++i ) {
        int a, b, c;
        read_int_nn(a), read_int_nn(b), read_int_nn(c);

        g[a].push_back(mp(b, c));
    }

    for ( int i= 1; i<=n; ++i ) {
        d[i]= inf;
    }
    dijkstra(x);

    fout<<d[y]<<"\n";

    return 0;
}