Cod sursa(job #582258)

Utilizator david95szabo david emanuel david95 Data 15 aprilie 2011 09:41:35
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 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;   
}