Cod sursa(job #1942377)

Utilizator failureJust a Joke failure Data 27 martie 2017 22:38:12
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>

#define MAXN 151
#define MAXT 3501
#define MAXQ 8001
#define INF 0x3f3f3f3f

using namespace std;

vector <pair <int, int> > G[MAXN];
pair <int, int> query[MAXQ];

int n, m, k, p, maxT, d[MAXN][MAXT], value[MAXN][MAXT];
bool seen[MAXN];

void dfs(int node)
{
    int son, i;
    seen[node] = 1;
    for(i=0; i<G[node].size(); ++i) {
        son = G[node][i].first;
        if(!seen[son])
            dfs(son);
    }
}

inline void computeBest(int time)
{
    int i, son, node, cost;

    for(node=1; node<=n; ++node) {
        if(!seen[node]) continue;
        if(d[node][time-1] != -INF)
            d[node][time] = d[node][time-1] + value[node][time];
        for(i=0; i<G[node].size(); ++i) {
            son = G[node][i].first;
            cost = G[node][i].second;
            if(time - cost < 0) continue;
            if(d[son][time-cost] == -INF) continue;
            d[node][time] = max(d[node][time], d[son][time-cost] + value[node][time]);
        }
    }
}

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

    int x, y, z, i, j;

    scanf("%d%d%d%d", &n, &m, &k, &p);
    for(i=1; i<=m; ++i) {
        scanf("%d%d%d", &x, &y, &z);
        G[x].push_back({y, z});
        G[y].push_back({x, z});
    }

    for(i=1; i<=k; ++i) {
        scanf("%d%d%d", &x, &y, &z);
        value[x][y] = z;
    }

    for(i=1; i<=p; ++i) {
        scanf("%d%d", &query[i].first, &query[i].second);
        maxT = max(maxT, query[i].second);
    }

    for(i=1; i<=n; ++i)
        for(j=0; j<=maxT; ++j)
            d[i][j] = -INF;

    d[1][0] = 0;
    dfs(1);
    for(i=1; i<=maxT; ++i)
        computeBest(i);

    for(i=1; i<=p; ++i) {
        x = query[i].first;
        y = query[i].second;
        if(!seen[x]) printf("-1\n");
        else printf("%d\n", d[x][y]);
    }

    return 0;
}