Cod sursa(job #80310)

Utilizator devilkindSavin Tiberiu devilkind Data 27 august 2007 12:25:24
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
#define NMAX 200
#define TMAX 3502

struct lista{long int nod,cst;
             lista *urm;} *vf[NMAX];

long int a[TMAX][NMAX],i,j,k,n,P,m,x,y,z;
long int am[TMAX][NMAX];

inline long int MAXX(long int a, long int b)
{
if (a>b) return a;
return b;
}

void DP()
{
for (i=0;i<=3500;i++)
        for (j=1;j<=n;j++)
                a[i][j]=-1;

lista *p;
a[0][1]=0;
for (i=1;i<=3500;i++)
        for (j=1;j<=n;j++)
                {
                if (a[i-1][j]!=-1) a[i][j]=a[i-1][j]+am[i][j];                
                for (p=vf[j];p;p=p->urm)
                        {
                        if (p->cst>i) continue;
                        if (a[i-p->cst][p->nod]==-1) continue;
                        a[i][j]=MAXX(a[i][j],a[i-p->cst][p->nod]+am[i][j]);
                        }
                }
}

int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
scanf("%ld %ld %ld %ld",&n,&m,&k,&P);
lista *p;

for (i=1;i<=m;i++)
        {
        scanf("%ld %ld %ld",&x,&y,&z);

        p=new lista;
        p->nod=x;
        p->cst=z;
        p->urm=vf[y];
        vf[y]=p;

        p=new lista;
        p->nod=y;
        p->cst=z;
        p->urm=vf[x];
        vf[x]=p;
        }

for (i=1;i<=k;i++)
        {
        scanf("%ld %ld %ld",&x,&y,&z);
        am[y][x]=z;
        }

DP();

for (i=1;i<=P;i++)
        {
        scanf("%ld %ld",&x,&y);
        printf("%ld\n",a[y][x]);
        }
return 0;
}