Cod sursa(job #345699)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 4 septembrie 2009 12:01:16
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define Nmax 155
#define Pmax 8005
#define Mmax 1505
#define Kmax 12005
#define Tmax 3505
#define pb push_back
#define mp make_pair
#define urm first
#define c second
#define IT vector < pair<int,int> >:: iterator 
using namespace std;

vector< pair<int,int> > v[Nmax];
int n,m,p,k;
int i,j;
int d[Tmax][Nmax];
vector< pair<int,int> > a[Tmax];
IT it[Nmax];

void read(){
   int i,aa,b,c; IT q;
   freopen("amenzi.in","r",stdin);
   freopen("amenzi.out","w",stdout);
   scanf("%d%d%d%d",&n,&m,&k,&p);
   for(i=1;i<=m;++i){
   	scanf("%d%d%d",&aa,&b,&c);
      v[aa].pb(mp(b,c));
      v[b].pb(mp(aa,c));
   }
   for(i=1;i<=k;++i){
   	scanf("%d%d%d",&aa,&b,&c);
      a[aa].pb(mp(b,c));
   }
   for(i=1;i<=n;++i){
                     sort(a[i].begin(),a[i].end());
                     }
}

void work(){
     int i,j,t; IT k;
     for(i=0;i<Tmax;++i)
       for(j=1;j<=n;++j) d[i][j]=-1;
     for(i=1;i<=n;++i) it[i]=a[i].begin();
     
     d[0][1]=0;
     for(t=0;t<Tmax;++t){
       for(j=1;j<=n;++j){

         if(t>0) d[t][j]=max(d[t][j],d[t-1][j]);
         
         for(  k=v[j].begin(); k!=v[j].end();k++ )
           if(t- k->c >=0) d[t][j]=max(d[t][j],d[t- k->c][k->urm]);

         if(d[t][j] ==-1) continue;
         for( ; it[j]!=a[j].end() && it[j]->urm<t; it[j]++);
         for( ; it[j]!=a[j].end() && it[j]->urm==t; it[j]++ )
           d[t][j] += it[j]->c;
       }
       }
} 

void solve(){
     int i,a,b;
     for(i=1;i<=p;++i){
        scanf("%d%d",&a,&b);
        printf("%d\n",d[b][a]);
        }
     fclose(stdin); fclose(stdout);
}                                                                                 

int main(){
	read();
    work();
    solve();
    return 0;
}