Cod sursa(job #1033512)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 17 noiembrie 2013 02:25:41
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream>
using namespace std;
typedef struct celula{
            int nod;
            celula *next;
            }*lista;
lista graf[155],v;
int i,n,m,k,p,x,y,cost[155][155],infr[3505][155],sol[3505][155],j;

int main(void) {
    ifstream fin("amenzi.in");
    ofstream fout("amenzi.out");
    fin>>n>>m>>k>>p;
    for (i=1; i<=m; ++i) {
        fin>>x>>y; fin>>cost[x][y]; cost[y][x]=cost[x][y];
        v=new celula; v->nod=x; v->next=graf[y]; graf[y]=v;
        v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
        }
    for (i=1; i<=k; ++i) {
          fin>>x>>y; int aux; fin>>aux; infr[y][x]=max(aux,infr[y][x]);
          }
    // sol[i][j]= amenda maxima daca in momentul i ma aflu in intersectia j
    for (i=2; i<=n; ++i) sol[0][i]=-1;
    
    for (i=1; i<=3500; ++i) 
     for (j=1; j<=n; ++j){
         bool ok=1;
         for (lista p=graf[j]; p; p=p->next)
          if (i-cost[p->nod][j]>=0&&sol[i-cost[p->nod][j]][p->nod]!=-1&&sol[i-cost[p->nod][j]][p->nod]>=sol[i][j]){
            sol[i][j]=sol[i-cost[p->nod][j]][p->nod];
            ok=0;
            }
         if (ok) sol[i][j]=-1; else sol[i][j]+=infr[i][j];
         }
    for (i=1; i<=p; ++i) {
         fin>>x>>y;
         fout<<sol[y][x]<<"\n";
         }
 return(0);
}