Pagini recente » Cod sursa (job #2077048) | Cod sursa (job #1821325) | Cod sursa (job #2869874) | Cod sursa (job #2155176) | Cod sursa (job #2051189)
#include <cstring>
#include <cstdio>
#include <vector>
#define N 1505
#define max(a, b) a>b?a:b
using namespace std;
int n, m, k, p, x, y, c, val[N][N], din[N][N];
vector <pair<int, int> > graf[N];
pair<int, int> test[N];
void citire()
{
scanf("%d %d %d %d\n", &n, &m, &k, &p);
for(int i=0;i<m;i++)
{
scanf("%d %d %d\n", &x, &y, &c);
graf[x].push_back(make_pair(y, c));
graf[y].push_back(make_pair(x, c));
}
for(int i=0;i<k;i++)
{
scanf("%d %d %d\n", &x, &y, &c);
val[x][y]+=c;
}
}
void rezolvare(int timp)
{
for(int nod=1;nod<=n;nod++)
{
if(din[nod][timp-1]!=-1)
din[nod][timp]=din[nod][timp-1]+val[nod][timp];
for(int i=0;i<graf[nod].size();i++)
{
int f=graf[nod][i].first;
int min=graf[nod][i].second;
if(timp-min>=0 && din[f][timp-min]!=-1)
din[nod][timp]=max(din[nod][timp], din[f][timp-min]+val[nod][timp]);
}
}
}
int main()
{
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
citire();
int maxi=-1;
for(int i=1;i<=p;i++)
{
scanf("%d %d\n", &test[i].first, &test[i].second);
maxi=max(maxi, test[i].second);
}
for(int i=1;i<=n;i++)
for(int j=0;j<=n;j++)
din[i][j]=-1;
din[1][0]=0;
for(int i=1;i<=maxi;i++)
rezolvare(i);
for(int i=1;i<=p;i++)
{
int nod=test[i].first;
int timp=test[i].second;
printf("%d\n", din[nod][timp]);
}
return 0;
}