Cod sursa(job #9456)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 27 ianuarie 2007 15:36:41
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 2.01 kb
#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++;
        }
        
        for (i=1;i<=n;i++) 
          for (j=g[i];j<g[i+1];j++) 
			if (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;
}