Cod sursa(job #9590)

Utilizator georgianaGane Andreea georgiana Data 27 ianuarie 2007 16:19:53
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 1.49 kb
#include <stdio.h>
#include <string.h>

int aux,vecin,tnou,n,m,k,p,gr[151],v[151][151],timp[151][151];
long int a[151][3502],am[151][3502];

int max(int a, int b)
{
    if (a>b) return a;
    else return b;
}
int main()
{
    freopen("amenzi.in","r",stdin);
    freopen("amenzi.out","w",stdout);
    scanf("%d %d %d %d",&n,&m,&k,&p);
    memset(am,0,sizeof(am));
    memset(gr,0,sizeof(gr));
    for (int q=0;q<m;q++)
    {
        int i,j,t;
        scanf("%d %d %d",&i,&j,&t);
        i--; j--;
        v[i][gr[i]]=j;
        timp[i][gr[i]]=t;
        gr[i]++;
        v[j][gr[j]]=i;
        timp[j][gr[j]]=t;
        gr[j]++;
    }
    for (int q=0;q<k;q++)
    {
        int i,t,val;
        scanf("%d %d %d",&i,&t,&val);
        am[i-1][t]+=val;
    }
    
    for (int t=0;t<3500;t++)
         for (int i=0;i<n;i++) a[i][t]=-1;

    a[0][0]=0;
    for (int t=0;t<3500;t++)
         for (int i=0;i<n;i++)
              if (a[i][t]>=0)
              {
                  aux=a[i][t]+am[i][t];
                  a[i][t+1]=max(a[i][t+1],aux);
                  for (int k=0;k<gr[i];k++)
                  {
                      vecin=v[i][k];
                      tnou=t+timp[i][k];
                      if (tnou<=3500) a[vecin][tnou]=max(a[vecin][tnou],aux);
                  }
              }
    
    for (int q=0;q<p;q++)
    {
        int i,t;
        scanf("%d %d",&i,&t);
        printf("%d\n",a[i-1][t]);
    }    
    fclose(stdout);
    return 0;
}