Pagini recente » Cod sursa (job #1276206) | Cod sursa (job #1716123) | Cod sursa (job #1130958) | Cod sursa (job #2913483) | Cod sursa (job #1608991)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
const int MAX_N = 156;
const int MAX_K = 12005;
int cost[MAX_N][MAX_N];
vector< pair<int, int> > taxes[MAX_N];
int dp[MAX_K];
struct Tax {
int time, place, value;
inline bool operator < (const Tax &other) const {
return time < other.time;
}
} tax[MAX_K];
int best[MAX_N][3505];
int last_time[MAX_N];
int main() {
ifstream fin("amenzi.in");
ofstream fout("amenzi.out");
int n, m, k, p, a, b, c;
fin >> n >> m >> k >> p;
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
cost[i][j] = 4000;
}
cost[i][i] = 0;
}
for (int i = 1; i <= m; ++ i) {
fin >> a >> b >> c;
cost[a][b] = min(cost[a][b], c);
cost[b][a] = min(cost[b][a], c);
}
for (int k = 1; k <= n; ++ k) {
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
cost[i][j] = min(cost[i][j], cost[i][k] + cost[k][j]);
}
}
}
for (int i = 1; i <= k; ++ i) {
fin >> tax[i].place >> tax[i].time >> tax[i].value;
}
sort(tax + 1, tax + k + 1);
for (int i = 1; i <= k; ++ i) {
if (cost[1][tax[i].place] > tax[i].time) {
dp[i] = 0;
} else {
dp[i] = tax[i].value;
for (int j = 1; j <= n; ++ j) {
int time = tax[i].time - cost[j][tax[i].place];
if (time > last_time[j]) {
time = last_time[j];
}
if (time >= 0) {
dp[i] = max(dp[i], best[j][time] + tax[i].value);
}
}
}
for (int j = last_time[tax[i].place] + 1; j < tax[i].time; ++ j) {
best[tax[i].place][j] = best[tax[i].place][j - 1];
}
best[tax[i].place][tax[i].time] = max(dp[i], max(best[tax[i].place][tax[i].time - 1], best[tax[i].place][tax[i].time]));
last_time[tax[i].place] = tax[i].time;
}
int place, time, answer;
for (int i = 1; i <= p; ++ i) {
fin >> place >> time;
if (cost[1][place] > time) {
fout << "-1\n";
continue;
}
answer = 0;
for (int j = 1; j <= n; ++ j) {
int last = time - cost[j][place];
if (last > last_time[j]) {
last = last_time[j];
}
if (last >= 0) {
answer = max(answer, best[j][last]);
}
}
fout << answer << "\n";
}
return 0;
}