Pagini recente » Cod sursa (job #2629232) | Cod sursa (job #1486925) | Cod sursa (job #3174906) | Cod sursa (job #1477114) | Cod sursa (job #11014)
Cod sursa(job #11014)
# include <stdio.h>
# define input "amenzi.in"
# define output "amenzi.out"
# define maxN 151
# define maxtimp 7503
# define max 8001
# define maxM 1501
long n,m,k,p,cost;
long x,y,c,C[maxtimp][maxN],s[maxtimp][maxN],tmax,i,j,val;
struct kt
{
long nod,cost;
}drum[maxN][maxM];
struct kkt
{
long x,y;
}sir[max];
struct lista
{
long nod,cost;
lista *next;
}*g[maxN],*f;
void adauga(long x,long y,long cost)
{
lista *fc = new lista;
fc->cost = cost;
fc->nod = y;
fc->next = g[x];
g[x] = fc;
fc = new lista;
fc->cost = cost;
fc->nod = x;
fc->next = g[y];
g[y] = fc;
}
int main()
{
freopen(input,"r",stdin);
freopen(output,"w",stdout);
scanf("%ld%ld%ld%ld",&n,&m,&k,&p);
for(i = 1;i<=m;i++)
{
scanf("%ld%ld%ld",&x,&y,&c);
drum[x][++drum[x][0].nod].nod = y;
drum[x][drum[x][0].nod].cost = c;
drum[y][++drum[y][0].nod].nod = x;
drum[y][drum[y][0].nod].cost = c;
adauga(x,y,c);
}
for(i = 1;i<=k;i++)
{
scanf("%ld%ld%ld",&x,&y,&cost);
s[y][x] += cost;
if(y > tmax)
tmax = y;
}
for(i = 2;i<=n;i++)
C[0][i] = -1;
/* for(i = 1;i<=tmax;i++)
{
for(j = 1;j<=n;j++)
if(!s[i][j] && !C[i][j])
s[i][j] = -INF;
} */
for(i = 1;i<=p;i++)
{
scanf("%ld%ld",&x,&y);
sir[i].x = x;
sir[i].y = y;
if(y > tmax)
tmax = y;
}
for(i = 1;i<=tmax;i++)
{
for(j = 1;j<=n;j++)
{
C[i][j] = C[i-1][j];
f = g[j];
k = drum[j][0].nod;
while(k)
{/*
x = f->nod;
c = f->cost;*/
x = drum[j][k].nod;
c = drum[j][k].cost;
if(i >= c)
{
if(C[i-c][x] > C[i][j])
C[i][j] = C[i-c][x];
val = C[i-c][x];
}
/* if(val == -1 && j > 1 && !C[i][j])
C[i][j] = -1;*/
k--;
// f=f->next;
}
if(C[i-1][j] > C[i][j])
C[i][j] = C[i-1][j];
if(C[i][j]!=-1)
C[i][j] += s[i][j];
}
}
/*
for(i= 1;i<=tmax;i++)
{
for(j = 1;j<=n;j++)
printf("%ld ",C[i][j]);
printf("\n");
}
*/
for(i = 1;i<=p;i++)
{
printf("%ld\n",C[sir[i].y][sir[i].x]);
}
return 0;
}