Cod sursa(job #9954)

Utilizator alextheroTandrau Alexandru alexthero Data 27 ianuarie 2007 19:38:44
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define infinite 1000000000
#define nmax 155
#define mmax 1505
#define kmax 12005
#define pmax 8005
#define tmax 3005

using namespace std;

int cst[nmax][nmax],c1[nmax][tmax],n,m,k,p,c[nmax][tmax];
vector <int> e[nmax];

int main() {
    freopen("amenzi.in","r",stdin);
    freopen("amenzi.out","w",stdout);

    scanf("%d %d %d %d\n",&n,&m,&k,&p);
    int n1,n2,t1;
    for(int i = 1; i <= n; i++) 
        e[i].push_back(i);
    for(int i = 1; i <= m; i++) {
        scanf("%d %d %d\n",&n1,&n2,&t1);
        e[n1].push_back(n2);
        e[n2].push_back(n1);
        cst[n1][n2] = t1;
        cst[n2][n1] = t1;
    }
    int tiempo,costo;
    for(int i = 1; i <= k; i++) {
        scanf("%d %d %d\n",&n1,&tiempo,&costo);
        c1[n1][tiempo] += costo;
    }

    for(int i = 1; i <= n; i++)
        for(int j = 0; j < tmax; j++) c[i][j] = -infinite;
    c[1][0] = c1[1][0];
    
    for(int j = 0; j < tmax; j++) 
        for(int i = 1; i <= n; i++) {
            if(c[i][j] == -infinite) c[i][j] = c[i][j-1];
            for(int k = 0; k < e[i].size(); k++) {
                int dn = e[i][k];
                if(j - cst[i][dn] >= 0) 
                    if(c[dn][j - cst[i][dn]] != -infinite)
                        if(c[dn][j - cst[i][dn]] + c1[i][j] > c[i][j]) c[i][j] = c[dn][j - cst[i][dn]] + c1[i][j];
            }
        }
    int nn1,pp1;
    for(int i = 1; i <= p; i++) {
        scanf("%d %d\n",&nn1,&pp1);
        printf("%d\n",max(c[nn1][pp1],-1));
    }

    return 0;
}