Cod sursa(job #1009677)

Utilizator visanrVisan Radu visanr Data 13 octombrie 2013 17:14:38
Problema Amenzi Scor 100
Compilator cpp Status done
Runda xxx Marime 1.56 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
 
const int NMAX = 155, TMAX = 3505, INF = 0x3f3f3f3f;
 
int N, M, K, P, A, B, C, Best[TMAX][NMAX], Sum[TMAX][NMAX];
vector<pair<int, int> > G[NMAX];
  
void GetMax()
{
    for(int i = 0; i < TMAX; ++ i)
        for(int j = 0; j < NMAX; ++ j)
            Best[i][j] = -1;
     
    Best[0][1] = Sum[0][1];
    for(int j = 1; j < TMAX; ++ j)
        for(int i = 1; i <= N; ++ i)
        {
            Best[j][i] = max(Best[j][i], Best[j - 1][i]);
            for(vector<pair<int, int> > :: iterator it = G[i].begin(); it != G[i].end(); ++ it)
                if(j - it -> second >= 0)
                    Best[j][i] = max(Best[j][i], Best[j - it -> second][it -> first]);
            if(Best[j][i] == -1) continue;
            Best[j][i] += Sum[j][i];
        }
         
}
 
int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
     
    scanf("%i %i %i %i", &N, &M, &K, &P);

    for(int i = 1; i <= M; ++ i)
    {
        scanf("%i %i %i", &A, &B, &C);
        G[A].push_back(make_pair(B, C));
        G[B].push_back(make_pair(A, C));
    }
    for(int i = 1; i <= N; ++ i)
        G[i].push_back(make_pair(i, 1));
     
    for(int i = 1; i <= K; ++ i)
    {
        scanf("%i %i %i", &A, &B, &C);
        Sum[B][A] += C;
    }
     
    GetMax();
    for(int i = 1; i <= P; ++ i)
    {
        scanf("%i %i", &A, &B);
        printf("%i\n", Best[B][A]);
    }
     
    return 0;
}