Cod sursa(job #3139828)

Utilizator anha3k25cvpNguyen Ngoc Tuan Anh anha3k25cvp Data 2 iulie 2023 06:13:57
Problema Amenzi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 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, mi;

int main() {
#define TASKNAME "amenzi"
    ios_base :: sync_with_stdio (0);
    cin.tie (0);
    if ( fopen( TASKNAME".inp", "r" ) ) {
        freopen (TASKNAME".inp", "r", stdin);
        freopen (TASKNAME".out", "w", stdout);
    }
    int n, m, k, q;
    cin >> n >> m >> k >> q;
    adj.resize(n + 1);
    mi.assign(n + 1, vector <int> (n + 1, inf));
    for (int i = 1; i <= m; i ++) {
        int u, v, w;
        cin >> u >> v >> w;
        mi[u][v] = w;
        mi[v][u] = w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }
    for (int k_ = 1; k_ <= n; k_ ++)
        for (int i = 1; i <= n; i ++)
            for (int j = 1; j <= n; j ++)
                mi[i][j] = min(mi[i][j], mi[i][k_] + mi[k_][j]);
    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, -inf));
    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)) + 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;
        if (mi[1][u] > t)
            cout << "-1\n";
        else
            cout << f[u][t] << '\n';
    }
    return 0;
}