Cod sursa(job #196908)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 30 iunie 2008 08:13:12
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#define N 3605
#define MAX 155
int n,m,k,p;
int v[N][N],c[N][N];
int s[N][MAX],best[MAX][N];
inline int max(int a,int b){
	(a>b)?(a):(a=b);
	return a;
}
int main() {
	int i,j,k,a,b,exp,best1;
	freopen("amenzi.in","r",stdin);
	freopen("amenzi.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&k,&p);
    for(;m>0;--m){
        scanf("%d%d%d",&a,&b,&exp);
        v[a][++v[a][0]]=b;
		c[a][v[a][0]]=exp;
        v[b][++v[b][0]]=a;
		c[b][v[b][0]]=exp;
    }
	for(;k>0;--k){
		scanf("%d%d%d",&a,&b,&exp);
		s[a][b]+=exp;
	}
    for(j=0;j<MAX;++j)
		for (i=1;i<=n;++i)
			best[j][i]=-1;
	for(j=0;j<MAX;++j)
		for (i=1;i<=n;++i){
			best1=-1;
			if (i==1)
				best1=0;
			for (k=1;k<=v[i][0];++k)
                if (j>=c[i][k])
                    best1=max(best1,best[j-c[i][k]][v[i][k]]);
            if (j>0)
				best1=max(best1,best[j-1][i]);
            if (best1!=-1)
				best1+=s[i][j];
			best[j][i]=best1;
		}
		for(;p>0;--p){
			scanf("%d%d",&a,&b);
			printf("%d\n",best[b][a]);
    }
    fclose(stdin);
	fclose(stdout);
    return 0;
}