Cod sursa(job #10569)

Utilizator cos_minBondane Cosmin cos_min Data 28 ianuarie 2007 18:02:40
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <stdio.h>

#define in "amenzi.in"
#define out "amenzi.out"

int a[3501][151], t[3501][151];
//bool sel[3501][151];
int x, timp;
int n, m, k, p;

typedef struct nod {
        int vf, tp;
        nod* next;
} *PNOD;

PNOD graph[151];

void ReadData();
void Solve();
void Add(int,int,int);

int main()
{
    ReadData();
    
    return 0;
}

void ReadData()
{
     int c,d,e;
     freopen(in,"r",stdin);
     freopen(out,"w",stdout);
     
     scanf("%d%d%d%d", &n,&m,&k,&p);
     
     for ( int i = 1; i <= m; i++ )
     {
         scanf("%d%d%d",&c,&d,&e);
         Add(c,d,e);
         Add(d,c,e);
     }
     
     for ( int i = 1; i <= k; i++ )
     {
         scanf("%d%d%d",&c,&d,&e);
         t[d][c] = e;
     }
     
     Solve();
     
     for ( int i = 1; i <= p; i++ )
     {
         scanf("%d%d",&x,&timp);
         printf("%d\n",a[timp][x]);
     }
     
   /*  for ( int i = 1; i <= 50; i++ )
     {
         for ( int j = 1; j <= n; j++ ) 
         {
             printf("%d ",a[i][j] );
         }
         printf("\n");
     }*/
         
}

void Add(int i, int j, int c)
{
     PNOD q = new nod;
     q->vf = i;
     q->tp = c;
     q->next = graph[j];
     graph[j] = q;
}

void Solve()
{
     for ( int i = 1; i <= 3501; i++ )
         for ( int j = 1; j <= n; j++ ) 
             a[i][j] = -1;
     
     
     a[1][1] = t[1][1];
     
     for ( int i = 2; i <= 3501; i++ )
         if ( a[i][1] < a[i-1][i] ) a[i][1] = a[i-1][1];
     
     for ( PNOD q = graph[1]; q; q=q->next )    
     {
         a[q->tp][q->vf] = t[q->tp][q->vf]; 
     }  
     
     for ( int i = 1; i <= 3501; i++ )
     {
         for ( int j = 1; j <= n; j++ ) 
         {
             if ( a[i][j] > -1 )
             {
                  if ( a[i+1][j] < a[i][j] ) a[i+1][j] = a[i][j];
                  for ( PNOD q = graph[j]; q; q=q->next )
                  {
                      if ( i+q->tp > 3501 ) continue;
                      if ( a[i+q->tp][q->vf] < a[i][j] + t[i+q->tp][j] )
                      {
                           a[i+q->tp][q->vf] = a[i][j] + t[i+q->tp][j];
                      }
                  }
             }
         }
     }
}