Cod sursa(job #11747)

Utilizator cos_minBondane Cosmin cos_min Data 1 februarie 2007 15:49:06
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <stdio.h>
#include <fstream>
using namespace std;

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

int a[3502][151]; 
int t[3502][151];
int cost[151][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 main()
{
    ReadData();
    
    return 0;
}

void ReadData()
{
     int c,d,e;
     
     for ( int i = 0; i <= 3501; i++ )
         for ( int j = 0; j <= n; j++ ) 
         {     
             t[i][j] = 0;
             a[i][j] = -1;
         }
         
     for ( int i = 1; i <= n; i++ )
         for ( int j = 1; j <= n; j++ ) 
             cost[i][j] = 0;
     
     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);
         if ( cost[c][d] == 0 ) Add(c,d), Add(d,c);
         if ( cost[c][d] == 0 || cost[c][d] > e ) cost[c][d] = cost[d][c] = e;
     }
     
     for ( int i = 1; i <= k; i++ )
     {
         scanf("%d%d%d",&c,&d,&e);
         if ( t[d][c] == 0 || t[d][c] < 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 = 0; i <= 50; i++ )
     {
         for ( int j = 1; j <= n; j++ ) 
         {
             printf("%d ",t[i][j] );
         }
         printf("\n");
     }*/
         
}

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

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