Cod sursa(job #9969)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 27 ianuarie 2007 19:49:31
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#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;
}