Cod sursa(job #24600)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 2 martie 2007 23:36:18
Problema Amenzi Scor 60
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.79 kb

  const
       FIN = 'amenzi.in';
       FOUT = 'amenzi.out';
       NMAX = 151;
       TMAX = 3502;

  type
      time_matrix = array[ 0..NMAX, 0..TMAX ] of longint;
      graph = array[ 0..NMAX, 0..NMAX ] of longint;

  var
     S, T : time_matrix;
     A, COST : graph;
     f, g : text;
     N, M, K, P : longint;

 procedure read_data;
  var i, x, y, c : longint;
  begin
   assign( f, FIN ); reset( f ) ; readln( f, N, M, K, P );
   for i := 1 to M do
     begin
       readln( f, x, y, c );
       inc( A[x,0] ); A[ x, A[x,0] ] := y; COST[ x, y ] := c;
       inc( A[y,0] ); A[ y, A[y,0] ] := x; COST[ y, x ] := c;
     end;
   for i := 1 to K do
     begin
      readln( f, x, y, c );
      inc( S[ x, y ], c );
     end;
 end;

 function max( a, b : longint ) : longint;
  begin
   if a > b then max := a else max := b;
  end;

 procedure dinamica;
  var i, j, k, nod : longint;
  begin
    for i := 1 to N do T[ i, 0 ] := -1;
    T[ 1, 0 ] := S[ 1, 0 ];
    for i := 1 to TMAX do
     for j := 1 to N do
        begin
          T[ j, i ] := -1;
          if T[ j, i - 1 ] <> - 1 then T[ j, i ] := T[ j, i - 1 ] + S[ j, i ];
          for  k := 1 to A[j][0] do
             begin
               nod := A[j][k];
               if ( i - cost[ j, nod ] > -1 ) then
               if ( cost[ j, nod ] > 0 ) and ( T[ nod, i - cost[j,nod] ] <> - 1 ) then
               T[ j, i ] := MAX( T[ j, i ], T[ nod, i - cost[ j, nod ] ] + S[ j, i ] );
              end;
         end;
 end;

 procedure save;
  var i, x, y : longint;
  begin
   assign( g, FOUT ); rewrite( g );
   for i := 1 to P do
    begin
     readln( f, x, y );
     writeln( g, T[x,y] );
    end;
   close( f );
   close( g );
  end;

   begin
    read_data;
    dinamica;
    save;
   end.