Pagini recente » Cod sursa (job #1755209) | Cod sursa (job #828084) | Cod sursa (job #393493) | Cod sursa (job #1060805) | Cod sursa (job #9879)
Cod sursa(job #9879)
#include <cstdio>
#include <vector>
#define pb push_back
#define sz(a) int((a).size())
using namespace std;
#define Nmax 300
#define Mmax 4000
#define Tmax 4000
#define inf 1000000000
int n, m, k, p, i, j, a, b, c, timp;
int dm[Tmax][Nmax], am[Tmax][Nmax], cost[Nmax][Nmax];
vector<int> lv[Nmax];
void citire()
{
scanf("%d %d %d %d\n", &n, &m, &k, &p);
for (i=1; i<=m; ++i)
{
scanf("%d %d %d\n", &a, &b, &c);
cost[a][b] = cost[b][a] = c;
lv[a].pb(b);
lv[b].pb(a);
}
for (i=1; i<=k; ++i)
{
scanf("%d %d %d\n", &a, &b, &c);
am[b][a] = c;
}
}
void solve()
{
dm[0][1] = am[0][1];
for (i=2; i<=n; ++i)
dm[0][i] = - inf;
for (timp=1; timp<=3500; ++timp)
{
for (i=1; i<=n; ++i)
{
dm[timp][i] = dm[timp-1][i];
for (j=0; j<sz(lv[i]); ++j)
if (timp - cost[i][lv[i][j]] >= 0)
if (dm[timp - cost[i][lv[i][j]]][lv[i][j]] > dm[timp][i])
dm[timp][i] = dm[timp - cost[i][lv[i][j]]][lv[i][j]];
if (dm[timp][i] >= 0)
dm[timp][i] += am[timp][i];
}
}
}
void scrie()
{
for (i=1; i<=p; ++i)
{
scanf("%d %d\n", &a, &b);
if (dm[b][a] < 0)
printf("-1\n");
else
printf("%d\n", dm[b][a]);
}
}
int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
citire();
solve();
scrie();
return 0;
}