Cod sursa(job #3139829)

Utilizator anha3k25cvpNguyen Ngoc Tuan Anh anha3k25cvp Data 2 iulie 2023 06:19:34
Problema Amenzi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define dl double
#define st first
#define nd second
#define II pair <int, int>

using namespace std;

const int N = 3501;
const int inf = 7 + 1e9;

vector <vector <II>> adj;
vector <vector <int>> cost, f;

int main() {
#define TASKNAME "amenzi"
    ios_base :: sync_with_stdio (0);
    cin.tie (0);
    if ( fopen( TASKNAME".in", "r" ) ) {
        freopen (TASKNAME".in", "r", stdin);
        freopen (TASKNAME".out", "w", stdout);
    }
    int n, m, k, q;
    cin >> n >> m >> k >> q;
    adj.resize(n + 1);
    for (int i = 1; i <= m; i ++) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }
    cost.assign(n + 1, vector <int> (N, 0));
    for (int i = 1; i <= k; i ++) {
        int u, t, c;
        cin >> u >> t >> c;
        cost[u][t] += c;
    }
    f.assign(n + 1, vector <int> (N, -1));
    f[1][0] = 0;
    for (int time = 0; time < N; time ++)
        for (int u = 1; u <= n; u ++) {
            f[u][time] = max(f[u][time], (time > 0 ? f[u][time - 1] : -inf));
            if (f[u][time] >= 0)
                f[u][time] += cost[u][time];
            for (auto z : adj[u])
                if (time + z.nd < N)
                    f[z.st][time + z.nd] = max(f[z.st][time + z.nd], f[u][time]);
        }
    while (q --) {
        int u, t;
        cin >> u >> t;
        cout << f[u][t] << '\n';
    }
    return 0;
}