Cod sursa(job #329638)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 6 iulie 2009 20:43:40
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
# include <cstdio>
# include <vector>

using namespace std;

# define FIN "amenzi.in"
# define FOUT "amenzi.out"

# define max(a, b) (a > b ? a : b)
# define pb push_back
# define mp make_pair
# define f first
# define s second
# define MAX_T 3510
# define MAX_P 8010
# define MAX_N 160

int N, M, K, P, i, j, max_t;
vector <pair <int, int> > G[MAX_N];
vector <pair <int, int> > :: iterator it;

int Best[MAX_N][MAX_T];
int Infractiune[MAX_N][MAX_T];

int X[MAX_P], Y[MAX_P];

       int main()
       {
           freopen(FIN, "r", stdin);
           freopen(FOUT, "w", stdout);
           
           scanf("%d%d%d%d", &N, &M, &K, &P);
           
           int a, b, c;
           for (i = 1; i <= M; ++i)
           {
               scanf("%d%d%d", &a, &b, &c);
               
               G[a].pb(mp(b, c)); G[b].pb(mp(a, c));
           }
           
           for (i = 1; i <= K; ++i)
           {
               scanf("%d%d%d", &a, &b, &c);
               
               Infractiune[a][b] += c;
           }
           
           for (i = 1; i <= P; ++i)
           {
               scanf("%d%d", &X[i], &Y[i]);
               
               max_t = max(max_t, Y[i]);
           }
           
           memset(Best, -1, sizeof(Best));
           
           Best[1][0] = Infractiune[1][0];
           for (i = 1; i <= max_t; ++i)
              for (j = 1; j <= N; ++j)
              {
                 Best[j][i] = Best[j][i - 1];
                 for (it = G[j].begin(); it != G[j].end(); ++it)
                    if (it -> s <= i)
                       Best[j][i] = max(Best[j][i], Best[it -> f][i - it -> s]);
                 if (Infractiune[j][i] && Best[j][i] != -1) Best[j][i] += Infractiune[j][i];
              }
              
           for (i = 1; i <= P; ++i)
              Best[X[i]][Y[i]] != -1 ? printf("%d\n", Best[X[i]][Y[i]]) : printf("0\n");
           
           return 0;
       }