Pagini recente » Cod sursa (job #1680143) | Cod sursa (job #285792) | Cod sursa (job #1034150) | Cod sursa (job #2569759) | Cod sursa (job #1321539)
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 200
#define MAXK 12500
struct amenda{int t; int val; int intersectie;};
amenda AM[MAXK];
int a[MAXN][MAXN];
int n, m, k, p;
bool comp(amenda o, amenda p)
{
if(o.t<p.t)
return 1;
else
if(o.t==p.t)
if(o.val>p.val)
return 1;
return 0;
}
void citire()
{
int i, x, y, c;
scanf("%d%d%d%d", &n, &m, &k, &p);
for(i=1;i<=m;++i)
{
scanf("%d%d%d", &x, &y, &c);
a[x][y]=a[y][x]=c;
}
for(i=1;i<=k;++i)
scanf("%d%d%d", &AM[i].intersectie, &AM[i].t, &AM[i].val);
sort(AM+1, AM+k+1, comp);
}
void RF()
{
int i, j, p;
for(p=1;p<=n;++p)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(a[i][p]&&a[p][j]&&(a[i][j]>a[i][p]+a[p][j]||!a[i][j])&&i!=j)
a[i][j]=a[i][p]+a[p][j];
}
void calcul(int pi, int ti)
{
int amd=0, timp=0;
int cursor=1;
int icurenta=1;
while(cursor<=k)
{
if(a[icurenta][AM[cursor].intersectie]+timp<=AM[cursor].t&&AM[cursor].t+a[AM[cursor].intersectie][pi]<=ti)
{
amd+=AM[cursor].val;
timp=AM[cursor].t;
icurenta=AM[cursor].intersectie;
}
++cursor;
}
printf("%d\n", amd);
}
void rezolva_problema()
{
citire();
RF();
int i, pi, ti;
for(i=1;i<=p;++i)
{
scanf("%d%d", &pi, &ti);
calcul(pi, ti);
}
}
int main()
{
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
rezolva_problema();
return 0;
}