Cod sursa(job #11571)

Utilizator cos_minBondane Cosmin cos_min Data 31 ianuarie 2007 21:20:04
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <stdio.h>
#include <fstream>
using namespace std;

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

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

void ReadData()
{
     int c,d,e;
     memset( t, 0, sizeof(t) );
     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);
         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)
{
     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[0][1] = t[1][0];
     //a[1][1] = t[1][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[1][0]; 
     }  
     
     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];
                      }
                  }
             }
         }
     }
}