Cod sursa(job #9989)

Utilizator svalentinValentin Stanciu svalentin Data 27 ianuarie 2007 19:59:57
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>

#include<vector>
using namespace std;

#define MAX(x,y) ((x)>(y)?(x):(y))

const int MAXN = 256;
const int MAXT = 4096;

int d[MAXT][MAXN];
int am[MAXT][MAXN];

vector <pair<int,int> > lad[MAXN];

int n, m, k, p;

int main(void)
{
    freopen("amenzi.in", "rt", stdin);
    freopen("amenzi.out", "wt", stdout);

    scanf("%d%d%d%d", &n, &m, &k, &p);

    int a, b, c;
    for (int i=0; i<m; ++i)
    {
        scanf("%d%d%d", &a, &b, &c); --a; --b;
        lad[a].push_back(make_pair(b,c));
        lad[b].push_back(make_pair(a,c));
    }

    for (int i=0; i<k; ++i)
    {
        scanf("%d%d%d", &a, &b, &c); --a;
        am[b][a] += c;
    }

    d[0][0] = 1;
    for (int i=0; i<MAXT-1; ++i)
        for (int j=0; j<n; ++j)
        if (d[i][j])
        {
            // incaseaza amenzi
            d[i][j] += am[i][j];

            // sta pe loc
            d[i+1][j] = MAX(d[i+1][j], d[i][j]);

            // se misca
            for (vector<pair<int, int> >::iterator it=lad[j].begin(); it!=lad[j].end(); ++it)
                if (i+it->second < MAXT)
                    d[i+it->second][it->first] = MAX(d[i+it->second][it->first], d[i][j]);
        }

    for (int i=0; i<p; ++i)
    {
        scanf("%d%d", &a, &b); --a;
        printf("%d\n", d[b][a]-1);
    }

    return 0;
}