Pagini recente » Euro3 | Monitorul de evaluare | Oxificare | Monitorul de evaluare | Cod sursa (job #9969)
Cod sursa(job #9969)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 160
#define maxt 3510
#define maxx 3010
#define maxm 1510
#define maxk 12010
#define maxp 8010
#define maxv -1
int n,m,X,Y;
int x[maxm],y[maxm],z[maxm];
int a[maxx],cost[maxx];
int g[maxn];
int p[maxk],sx[maxk],sy[maxk],sz[maxk];
int q[maxp],px[maxp],py[maxp],sol[maxp];
int c[maxn][maxt];
int cmp(int x,int y)
{
return ((sy[x]<sy[y]) || ((sy[x]==sy[y]) && (sx[x]<sy[y])));
}
int cmp2(int x,int y)
{
return ((py[x]<py[y]) || ((py[x]==py[y]) && (px[x]<py[x])));
}
int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
scanf("%d %d %d %d ",&n,&m,&X,&Y);
int i,j,k,I,J;
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<=X;i++)
{
scanf("%d %d %d",&sx[i],&sy[i],&sz[i]);
p[i]=i;
}
sort(p+1,p+X+1,cmp);
for (i=1;i<=Y;i++)
{
scanf("%d %d",&px[i],&py[i]);
q[i]=i;
}
sort(q+1,q+Y+1,cmp2);
for (i=1;i<=n;i++)
for (j=0;j<maxt;j++) c[i][j]=maxv;
c[1][0]=0;
I=1;J=1;
for (k=0;k<maxt;k++)
{
while ((I<=X) && (sy[p[I]]==k))
{
if (c[sx[p[I]]][k]>=0) c[sx[p[I]]][k]+=sz[p[I]];
I++;
}
while ((J<=Y) && (py[q[J]]==k))
{
sol[q[J]]=c[px[q[J]]][k];
J++;
}
if (J>Y) 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];
if ((k+1<maxt) && (c[i][k]>c[i][k+1])) c[i][k+1]=c[i][k];
}
}
for (i=1;i<=Y;i++) printf("%d\n",sol[i]);
return 0;
}