Cod sursa(job #253307)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 17:36:10
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
 #include <cstdio>  
 #include <string.h>  
 #include <vector>  
   
 using namespace std;  
   
 #define Tmax 3650  
 #define Nmax 160  
 #define pb push_back  
   
 int best[Tmax][Nmax];  
 int ev[Tmax][Nmax];  
   
 vector<int> l[Nmax], c[Nmax];  
   
 void fuck(int i,int j)  
 {  
     if(best[i+1][j] < best[i][j] + ev[i+1][j])  
         best[i+1][j] = best[i][j] + ev[i+1][j];  
     int b = best[i][j];  
   
     for (int k=0;k<l[j].size();++k)  
     {  
         int ora = i + c[j][k];  
         int v = l[j][k];  
         if(ora < Tmax && b + ev[ora][v] > best[ora][v])  
             best[ora][v] = b + ev[ora][v];  
     }     
 }     
   
 int main()  
 {  
     freopen("amenzi.in","r",stdin);  
     freopen("amenzi.out","w",stdout);  
   
     int n,m,k,p,a,b,C;  
   
     scanf("%d %d %d %d",&n,&m,&k,&p);  
   
     while(m--)  
     {  
         scanf("%d %d %d",&a,&b,&C);  
         --a, --b;  
         l[a].pb(b); c[a].pb(C);  
         l[b].pb(a); c[b].pb(C);  
     }  
   
     while(k--)  
     {  
         scanf("%d %d %d",&a,&b,&C);  
         ev[b][a-1] += C;  
     }  
       
       
     for (int i=0;i<Tmax;++i)  
         memset(best[i],-1,sizeof(best[i]));  
   
     best[0][0] = ev[0][0];  
     fuck(0,0);  
   
     for (int i=1;i<=3521;++i)  
         for (int j=0;j<n;++j)  
             if(best[i][j] >= 0)  
                 fuck(i,j);  
   
     for (int i=1;i<=p;++i)  
     {  
         scanf("%d %d",&b,&a);  
         printf("%d\n",best[a][b-1]);  
     }  
   
     return 0;  
}