Cod sursa(job #2407257)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 16 aprilie 2019 18:39:28
Problema Amenzi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<bits/stdc++.h>
using namespace std;
int n, m, k, p;
int xtr[152][4002], mx[152][4002];
int vec[152][152], cost[152][152], sz[152];
bool viz[152][4002];
int main()
{
    ifstream cin("amenzi.in");
    ofstream cout("amenzi.out");
    cin >> n >> m >> k >> p;
    for(int i = 1; i <= m; ++i)
    {
        int a, b, c;
        cin >> a >> b >> c;
        ++sz[a];
        ++sz[b];
        vec[a][sz[a]] = b, cost[a][sz[a]] = c;
        vec[b][sz[b]] = a, cost[b][sz[b]] = c;
    }
    for(int i = 1; i <= k; ++i)
    {
        int a, b, c;
        cin >> a >> b >> c;
        xtr[a][b] += c;
    }
    viz[1][0] = 1;
    for(int i = 0; i <= 3600; ++i)
    {
        if(i)
            for(int j = 1; j <= n; ++j)
                viz[j][i] = max(viz[j][i], viz[j][i-1]), mx[j][i] = max(mx[j][i-1], mx[j][i]);
        for(int j = 1; j <= n; ++j)
            if(viz[j][i])
                mx[j][i] += xtr[j][i];
        for(int j = 1; j <= n; ++j)
        {
            if(!viz[j][i])
                continue;
            for(int q = 1; q <= sz[j]; ++q)
            {
                int vecin = vec[j][q];
                int timp = cost[j][q];
                if(i+timp > 3600)
                    continue;
                viz[vecin][i+timp] = 1;
                mx[vecin][i+timp] = max(mx[vecin][i+timp], mx[j][i]);
            }
        }
    }
    for(int i = 1; i <= p; ++i)
    {
        int maax = -1;
        int a, b, c;
        cin >> a >> b;
        for(int q = 1; q <= sz[a]; ++q)
        {
            int vecin = vec[a][q];
            int timp = cost[a][q];
            if(b < timp)
                continue;
            if(!viz[vecin][b-timp])
                continue;
            maax=max(maax,mx[vecin][b-timp]);
        }
        cout << maax << '\n';
    }
    return 0;
}