Cod sursa(job #324044)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 14 iunie 2009 13:49:23
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>   
  
#define Nmax 152   
#define Tmax 3501   
  
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<Tmax;++i)   
        for(j=1;j<=n;++j)   
            d[i][j] = -1003456789;   
    d[0][1] = 0;           
           
    for(i=0;i<=Tmax;++i)   
        for(j=1;j<=n;++j)   
            if(d[i][j]>=0)   
            {   
                nod *current=p[j];   
                d[i][j]+=am[i][j];   
                d[i+1][j]=max(d[i][j],d[i+1][j]);   
                while(current)   
                    {   
                        if(i+current->cost<=Tmax)   
                          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);   
            if(d[b][a]>=0)   
            {   
            printf("%d\n",d[b][a]);   
            }   
            else   
            printf("-1\n");   
        }   
    return 0;       
}