Cod sursa(job #831643)

Utilizator danalex97Dan H Alexandru danalex97 Data 8 decembrie 2012 21:25:02
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
using namespace std;

const int Nmax = 200;
const int Mmax = 2000;
const int Tmax = 4000;

const int T = 3500;

int Edge[2][Mmax],Cost[Mmax];
int V[Tmax][Nmax],A[Tmax][Nmax];
int N,M,K,P;

ifstream F("amenzi.in");
ofstream G("amenzi.out");

int main()
{
    F>>N>>M>>K>>P;

    for (int i=1;i<=M;++i)
        F>>Edge[0][i]>>Edge[1][i]>>Cost[i];
    for (int i=M+1;i<=N+M;++i)
        Edge[0][i]=Edge[1][i]=i-M,
        Cost[i] = 1;
    M += N;

    for (int i=1,a,b,c;i<=K;++i)
    {
        F>>a>>b>>c;
        V[b][a] += c;
    }

    for (int i=0;i<=T;++i)
        for (int j=1;j<=N;++j)
            A[i][j] = -1;

    A[0][1]=0;

    for (int i=0;i<=T;++i)
    {
        for (int j=1;j<=M;++j)
            for (int k=0;k<2;++k)
                if ( i-Cost[j] >= 0 )
                    if ( A[ i-Cost[j] ][ Edge[k^1][j] ] != -1 )
                        A[i][ Edge[k][j] ] = max( A[i][ Edge[k][j] ] , A[ i-Cost[j] ][ Edge[k^1][j] ] );
        for (int j=1;j<=N;++j)
            A[i][j] += ( A[i][j] >= 0 ) ? V[i][j] : 0;
    }

    for (int i=1,a,b;i<=P;++i)
    {
        F>>a>>b;
        G<<A[b][a]<<'\n';
    }

    F.close();
    G.close();

    return 0;
}