Cod sursa(job #9473)

Utilizator anoukAnca Dumitrache anouk Data 27 ianuarie 2007 15:42:45
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 2.66 kb
#include <cstdio>
#include <cstring>
#include <fstream>
#include <iostream>
#define DIM 151
using namespace std;

int n, m, k, p;
typedef struct Nod {
       int vf;
       int cost;
       Nod *next;
} NOD, *PNOD;
PNOD L[DIM];
struct Amenda {
       int timp[DIM];
       int pret[DIM];
       int la;
};
Amenda sam[DIM];
int selam[DIM];
int maxim;
int s[DIM], dist[DIM];
int amp;
int lf, tf;
int tata[DIM];

void DF(int nod);
void Write();
void Add(int i, int j, int c);

FILE *fout = fopen("amenzi.out", "w");

int main()
{
     FILE *fin = fopen("amenzi.in", "r");
     fscanf(fin, "%d%d%d%d", &n, &m, &k, &p);
     int v1, v2, c;
     for (int i = 1; i <= m; i++)
     {
         fscanf(fin, "%d%d%d", &v1, &v2, &c);
         Add(v1, v2, c);
         Add(v2, v1, c);
     }
     int v, tp, pr;
     for (int i = 1; i <= k; i++)
     {
         fscanf(fin, "%d%d%d", &v, &tp, &pr);
         selam[v] = 1;
         sam[v].la++;
         sam[v].timp[sam[v].la] = tp;
         sam[v].pret[sam[v].la] = pr;
     }
     for (int i = 1; i <= p; i++)
     {
         fscanf(fin, "%d%d", &lf, &tf);
         maxim = 0;
         amp = 0;
         memset(dist, 0, sizeof(dist));
         memset(tata, 0, sizeof(tata));
         memset(s, 0, sizeof(s));
         DF(1);
         Write();
     }
     fclose(fin);
     fclose(fout);
     return 0;
}

void Add(int i, int j, int c)
{
     PNOD p = new NOD;
     p->vf = j;
     p->cost = c;
     p->next = L[i];
     L[i] = p;
}

void DF(int nod)
{
   //  s[nod] = 1;
     int aux;
  //   cout << nod << " " << dist[nod] << " " << amp; cin.get();
     for (PNOD p = L[nod]; p; p = p->next)
        // if (!s[p->vf])
         if (dist[nod] + p->cost <= tf)
         {
            tata[p->vf] = nod;
            dist[p->vf] = dist[nod] + p->cost;
         //   if (p->vf == 3) {cout << p->vf << " " << dist[p->vf] ; cin.get();}
            if (dist[p->vf] == tf && p->vf != lf) return;
            if (p->vf == lf)
            {
               maxim = max(maxim, amp);
               return;
            }
            if (selam[p->vf])
               for (int i = 1; i <= sam[p->vf].la; i++)
                   if (dist[p->vf] <= sam[p->vf].timp[i])
                   {
                      aux = dist[p->vf];
                      dist[p->vf] = sam[p->vf].timp[i];
                      amp += sam[p->vf].pret[i];
                      DF(p->vf);
                      amp -= sam[p->vf].pret[i];
                      dist[p->vf] = aux;
                   }
            DF(p->vf);
         }
  //   s[nod] = 0;
}

void Write()
{
     fprintf(fout, "%d\n", maxim);
}