Pagini recente » Cod sursa (job #830320) | Cod sursa (job #3166735) | Cod sursa (job #1609825) | Cod sursa (job #2273572) | Cod sursa (job #1343167)
#include <bits/stdc++.h>
using namespace std;
const int Tmax = 3500;
const int Nmax = 150;
const int Mmax = 1500;
struct Edge
{
int nod;
int cost;
int urm;
};
Edge G[2 * Mmax + 1];
int contor;
int head[Nmax + 1];
int dp[Tmax + 1][Nmax + 1];
int ticket[Tmax + 1][Nmax + 1];
int N, M, K, P;
void addEdge(int x, int y, int c)
{
contor++;
G[contor].nod = y;
G[contor].cost = c;
G[contor].urm = head[x];
head[x] = contor;
}
int main()
{
ifstream in("amenzi.in");
ofstream out("amenzi.out");
ios_base::sync_with_stdio(false);
in >> N >> M >> K >> P;
for ( int i = 1; i <= M; ++i )
{
int a, b, c;
in >> a >> b >> c;
addEdge(a, b, c);
addEdge(b, a, c);
}
for ( int i = 1; i <= K; ++i )
{
int a, b, c;
in >> a >> b >> c;
ticket[b][a] += c;
}
for ( int i = 0; i <= Tmax; ++i )
for ( int j = 0; j <= Nmax; ++j )
dp[i][j] = -2e9;
dp[0][1] = ticket[0][1];
for ( int t = 1; t <= Tmax; ++t )
{
for ( int nod = 1; nod <= N; ++nod )
{
dp[t][nod] = dp[t - 1][nod] + ticket[t][nod];
for ( int p = head[nod]; p != 0; p = G[p].urm )
{
int fiu = G[p].nod;
int cost = G[p].cost;
if ( t >= cost )
dp[t][nod] = max(dp[t][nod], dp[t - cost][fiu] + ticket[t][nod]);
}
}
}
for ( int i = 1; i <= P; ++i )
{
int a, b;
in >> a >> b;
if ( dp[b][a] >= 0 )
out << dp[b][a] << "\n";
else
out << "-1\n";
}
return 0;
}