Cod sursa(job #1240537)

Utilizator xtreme77Patrick Sava xtreme77 Data 11 octombrie 2014 16:19:35
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <vector>

#define mp make_pair
#define pb push_back
#define f first
#define s second
#define NOT -1

const char IN [ ] = "amenzi.in" ;
const char OUT [ ] = "amenzi.out" ;
const int MAX_N = 154  ;
const int MAX_T = 3514 ;

using namespace std;

typedef pair < int , int > P ;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

vector < P > gr [ MAX_N ] ;

int amenzi [ MAX_T ] [ MAX_N ] , dp [ MAX_T ] [ MAX_N ] , n ;

void do_the_acceptedjob ( ) ;

int main(              )
{
    int m , k , p ;
    fin >> n >> m >> k >> p ;
    for ( ; m ; -- m )
    {
        int x , y , cost ;
        fin >> x >> y >> cost ;
        gr [ x ].pb ( mp ( y , cost ) ) ;
        gr [ y ].pb ( mp ( x , cost ) ) ;
    }
    for ( ; k ; -- k )
    {
        int x , y , cost ;
        fin >> x >> y >> cost ;
        amenzi [ y ] [ x ] = amenzi [ y ] [ x ] + cost ;
    }
    do_the_acceptedjob ( ) ;
    for ( int i = 1 ; i <= p ; ++ i )
    {
        int a , b ;
        fin >> a >> b ;
        fout << dp [ b ] [ a ] << '\n' ;
    }
    return 0;
}
void do_the_acceptedjob ( )
{
    dp [ 0 ] [ 1 ] = 0 ;
    for ( int i = 2 ; i <= n ; ++ i )
        dp [ 0 ] [ i ] = NOT ;
    for ( int t = 1 ; t <= 3500 ; ++ t )
        for ( int i = 1 ; i <= n ; ++ i )
        {
            dp [ t ] [ i ] = dp [ t - 1 ] [ i ] ;
            if ( dp [ t ] [ i ] != NOT )
                dp [ t ] [ i ] += amenzi [ t ] [ i ] ;
            int solll = NOT ;
            for ( auto x : gr [ i ] )
            {
                int nod = x.f ;
                int cost = x.s ;
                if ( t - cost < 0 )
                    continue ;
                solll = max ( solll , dp [ t - cost ] [ nod ] ) ;
            }
            if ( solll != NOT )
                dp [ t ] [ i ] = max ( dp [ t ] [ i ] , solll + amenzi [ t ] [ i ] ) ;
        }
}