Cod sursa(job #1106617)

Utilizator gbi250Gabriela Moldovan gbi250 Data 12 februarie 2014 22:35:20
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <cctype>

#define SIZE 250005
#define SIZE_list 1005
#define cost first
#define node2 second
#define MX 1<<13

using namespace std;

int n, m, pos, source, sink, min_cost, dist[SIZE];

vector < pair < int, int > > adj[SIZE];
vector <int> lst[SIZE_list];
char buffer[MX];

inline void read();
inline void solve();
inline void write();

int main()
{
    read();
    solve();
    write();
    return 0;
}

inline int get_no()
{
    int number = 0;

    while( !isdigit( buffer[ pos ] ))
    {
        ++pos;
        if( pos >= MX )
        {
            fread( buffer, sizeof( char ), MX, stdin);
            pos = 0;
        }
    }

    while ( isdigit( buffer[ pos ] ) )
    {
        number = number * 10 + buffer[ pos ] - 48;
        ++pos;
        if( pos >= MX )
        {
            fread( buffer, sizeof( char ), MX, stdin);
            pos = 0;
        }
    }
    return number;
}

inline void read()
{
    freopen("pscnv.in", "r", stdin);
    fread(buffer, sizeof( char ), MX, stdin);
    n = get_no();
    m = get_no();
    source = get_no();
    sink = get_no();
    int x, y, cost;

    while ( m-- )
    {
        x = get_no();
        y = get_no();
        cost = get_no();
        adj[x].push_back( make_pair( cost, y ) );
    }
}

inline void solve()
{
    memset( dist, 0x3f, sizeof(dist) );

    lst[ 0 ].push_back( source );
    dist[ source ] = 0;

    for(int cst = 0; cst <= 1000; ++cst)
    {
        min_cost = cst;

        for(unsigned it = 0; it < lst[cst].size(); ++it)
        {
            int node = lst[cst][it];

            if( node == sink )
                return ;

            for(vector < pair < int, int > > :: iterator it = adj[ node ].begin(); it != adj[ node ].end(); ++it)
            {
                int cost_tmp = max( min_cost, (*it).cost );
               // printf("%d ", cost_tmp);
                if( dist[ (*it).node2 ] > cost_tmp )
                {
                    dist[ (*it).node2 ] = cost_tmp;
                    lst[ cost_tmp ].push_back( (*it).node2 );
                }
            }
        }
    }
}

inline void write()
{
    freopen("pscnv.out", "w", stdout);
    printf("%d\n", min_cost);
}