Pagini recente » Cod sursa (job #1766028) | Cod sursa (job #244874) | Cod sursa (job #325568) | Cod sursa (job #2982214) | Cod sursa (job #9989)
Cod sursa(job #9989)
#include<stdio.h>
#include<vector>
using namespace std;
#define MAX(x,y) ((x)>(y)?(x):(y))
const int MAXN = 256;
const int MAXT = 4096;
int d[MAXT][MAXN];
int am[MAXT][MAXN];
vector <pair<int,int> > lad[MAXN];
int n, m, k, p;
int main(void)
{
freopen("amenzi.in", "rt", stdin);
freopen("amenzi.out", "wt", stdout);
scanf("%d%d%d%d", &n, &m, &k, &p);
int a, b, c;
for (int i=0; i<m; ++i)
{
scanf("%d%d%d", &a, &b, &c); --a; --b;
lad[a].push_back(make_pair(b,c));
lad[b].push_back(make_pair(a,c));
}
for (int i=0; i<k; ++i)
{
scanf("%d%d%d", &a, &b, &c); --a;
am[b][a] += c;
}
d[0][0] = 1;
for (int i=0; i<MAXT-1; ++i)
for (int j=0; j<n; ++j)
if (d[i][j])
{
// incaseaza amenzi
d[i][j] += am[i][j];
// sta pe loc
d[i+1][j] = MAX(d[i+1][j], d[i][j]);
// se misca
for (vector<pair<int, int> >::iterator it=lad[j].begin(); it!=lad[j].end(); ++it)
if (i+it->second < MAXT)
d[i+it->second][it->first] = MAX(d[i+it->second][it->first], d[i][j]);
}
for (int i=0; i<p; ++i)
{
scanf("%d%d", &a, &b); --a;
printf("%d\n", d[b][a]-1);
}
return 0;
}