Cod sursa(job #292809)

Utilizator ZillaMathe Bogdan Zilla Data 31 martie 2009 18:30:46
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>

#define Nmax 151
#define Tmax 7501

struct nod{
    int info,cost;
    nod *next;
};

nod *p[Nmax];

int n,m,k,P,d[Tmax][Nmax],am[Tmax][Nmax];

int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

void add(int a,int b,int c)
{
    nod *current=new nod;
    current->info=b;
    current->cost=c;
    current->next=p[a];
    p[a]=current;
}

int main()
{
    freopen("amenzi.in","r",stdin);
    freopen("amenzi.out","w",stdout);
    
    int i,a,b,c,j;
    
    scanf("%d%d%d%d",&n,&m,&k,&P);
    
    for(i=1;i<=m;++i)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
    for(i=1;i<=k;++i)
        {
            scanf("%d%d%d",&a,&b,&c);
            am[b][a]=c;
        }
        
    for(i=0;i<=3500;++i)
        for(j=1;j<=n;++j)
            d[i][j] = -123456789;
    d[0][1] = 0;        
        
    for(i=0;i<=3500;++i)
        for(j=1;j<=n;++j)
            {
                nod *current=p[j];
                d[i][j]+=am[i][j];
                while(current)
                    {
                        d[i+current->cost][current->info]=max(d[i][j],d[i+current->cost][current->info]);
                        current=current->next;
                    }
            }
    for(i=1;i<=P;++i)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",d[b][a]);
        }
    return 0;    
}