Cod sursa(job #339463)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 9 august 2009 22:34:07
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <vector>

using namespace std;

#define file_in "amenzi.in"
#define file_out "amenzi.out"

#define mp make_pair
#define pb push_back

#define Nmax 200
#define Tmax 3501

vector< pair<int, int> > v[Nmax];
int n,m,k,p,i,j,a,b,c;
int t[Tmax][Nmax];
int am[Tmax][Nmax];


inline int max(int a, int b) { return a>b?a:b; }

int main()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d %d %d", &n,&m,&k,&p);
	
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d", &a, &b,&c);
		a--;
		b--;
		v[a].pb(mp(b,c));
		v[b].pb(mp(a,c));
	}
	
	for (i=1;i<=k;++i)
	{
		scanf("%d %d %d", &a, &b,&c);
		a--;
		am[b][a]+=c;
	}
	
	vector< pair <int,int> > :: iterator it;
	
	t[0][0]=1;
	for (i=0;i<Tmax;++i)
	    for (j=0;j<n;++j)
		     if (t[i][j]!=0)
			 {
				t[i][j]+=am[i][j];
				t[i+1][j]=max(t[i][j],t[i+1][j]);
				for (it=v[j].begin();it!=v[j].end();++it)
					 if (i+it->second<Tmax)
						 t[i+it->second][it->first]=max(t[i+it->second][it->first], t[i][j]);
			 }
			 
	for (i=1;i<=p;++i)
	{
		scanf("%d %d", &a, &b);
		a--;
		printf("%d\n", t[b][a]-1);
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}