Pagini recente » Cod sursa (job #792528) | Cod sursa (job #2501617) | Cod sursa (job #1472036) | Cod sursa (job #1743158) | Cod sursa (job #9967)
Cod sursa(job #9967)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxm 1510
#define maxx 3010
#define maxn 160
#define maxT 3510
#define maxp 8010
#define maxk 12010
#define maxv -1
int n,m,p,q,T,I;
int x[maxm],y[maxm],z[maxm];
int g[maxn];
int a[maxx],cost[maxx];
int c[maxn][maxT];
int sx[maxk],sy[maxk],sz[maxk],ps[maxk];
int px[maxp],py[maxp],pp[maxp],sol[maxp];
int cmp(int x,int y)
{
return ((sy[x]<sy[y]) || ((sy[x]==sy[y]) && (sx[x]<sx[y])));
}
int cmp2(int x,int y)
{
return (py[x]<py[y]);
}
int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
scanf("%d %d %d %d",&n,&m,&q,&p);
int i,j,k,aux;
for (i=1;i<=m;i++)
{
scanf("%d %d %d",&x[i],&y[i],&z[i]);
g[x[i]]++;
g[y[i]]++;
}
for (i=2;i<=n+1;i++) g[i]+=g[i-1];
for (i=1;i<=m;i++)
{
a[g[x[i]]]=y[i];
cost[g[x[i]]--]=z[i];
a[g[y[i]]]=x[i];
cost[g[y[i]]--]=z[i];
}
for (i=1;i<=n+1;i++) g[i]++;
for (i=1;i<=q;i++)
{
scanf("%d %d %d",&sx[i],&sy[i],&sz[i]);
ps[i]=i;
}
sort(ps+1,ps+q+1,cmp);
for (i=1;i<=p;i++)
{
scanf("%d %d",&px[i],&py[i]);
pp[i]=i;
}
sort(pp+1,pp+p+1,cmp2);
for (i=1;i<=n;i++)
for (j=0;j<=maxT;j++) c[i][j]=maxv;
c[1][0]=0;
T=1;
I=1;
for (k=0;k<maxT;k++)
{
while ((I<=q) && (sy[ps[I]]==k))
{
if (c[sx[ps[I]]][k]>=0) c[sx[ps[I]]][k]+=sz[ps[I]];
I++;
}
while ((T<=p) && (py[pp[T]]==k))
{
if (c[px[pp[T]]][k]<0) sol[pp[T]]=-1;
else sol[pp[T]]=c[px[pp[T]]][k];
T++;
}
if (T>p) break;
for (i=1;i<=n;i++)
for (j=g[i];j<g[i+1];j++)
if ((k+cost[j]<maxT) && (c[i][k]>c[a[j]][k+cost[j]])) c[a[j]][k+cost[j]]=c[i][k];
}
for (i=1;i<=p;i++) printf("%d\n",sol[i]);
return 0;
}