Cod sursa(job #3275416)

Utilizator MAlex2019Melintioi George Alexandru MAlex2019 Data 10 februarie 2025 14:43:53
Problema Amenzi Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("amenzi.in");
ofstream fout("amenzi.out");

const int maxn = 150;
const int maxt = 3500;
vector<pair<int,int>> adj[maxn + 1];
long long amenda[maxn + 1][maxt + 1];
int visited[maxn + 1][maxt + 1];
long long dp[maxn + 1][maxt + 1];

int main() {
    int n, m, k, p;
    fin >> n >> m >> k >> p;
    for (int i = 0; i < m; i++) {
        int a, b, c;
        fin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    for (int i = 0; i < k; i++) {
        int a, b, c;
        fin >> a >> b >> c;
        amenda[a][b] += c;
    }
    vector<pair<int,int>> queries(p);
    for (int i = 0; i < p; i++)
        fin >> queries[i].first >> queries[i].second;
    
    visited[1][0] = 1;
    dp[1][0] = amenda[1][0];
    for (int t = 0; t <= maxt; t++)
        for (int i = 1; i <= n; i++)
            for (auto j: adj[i]) {
                int child = j.first;
                int time = j.second;
                if (t - time >= 0 && visited[child][t - time] == 1) {
                    visited[i][t] = 1;
                    dp[i][t] = max(dp[i][t], dp[child][t - time] + amenda[i][t]);
                }
                if (t - 1 >= 0 && visited[child][t - 1] == 1) {
                    // visited[i][t] = 1;
                    dp[i][t] = max(dp[i][t], dp[i][t - 1]);
                }
            }

    for (auto q: queries)
        if (visited[q.first][q.second] == 0)
            fout << "-1\n";
        else
            fout << dp[q.first][q.second] << '\n';

    return 0;
}