Cod sursa(job #10134)

Utilizator gcosminGheorghe Cosmin gcosmin Data 27 ianuarie 2007 22:01:39
Problema Amenzi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <vector>
using namespace std;

#define NMAX 160
#define TMAX 3600
#define INF 1000000000

int N, M, K, P;

int cast[NMAX][TMAX];
int a[NMAX][TMAX];

vector <pair<int, int> > leg[NMAX];

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

int main()
{
	int i, x, y, T, c;
	
	freopen("amenzi.in", "r", stdin);
	freopen("amenzi.out", "w", stdout);

	scanf("%d %d %d %d", &N, &M, &K, &P);

	for (i = 1; i <= M; i++) {
		scanf("%d %d %d", &x, &y, &c);

		leg[x].push_back(make_pair(y, c));
		leg[y].push_back(make_pair(x, c));
	}

	for (i = 1; i <= N; i++) leg[i].push_back(make_pair(i, 1));

	for (i = 1; i <= K; i++) {
		scanf("%d %d %d", &x, &T, &c);
		cast[x][T] += c;
	}

	int j;
	for (i = 0; i < TMAX; i++) 
		for (j = 1; j <= N; j++) a[j][i] = -INF;
	
	a[1][0] = 0;

	vector <pair<int, int> > :: iterator it;
	for (T = 0; T < TMAX; T++) {
		for (i = 1; i <= N; i++) {
			for (it = leg[i].begin(); it != leg[i].end(); it++) 
				if (T + (*it).second < TMAX) 
					a[(*it).first][T + (*it).second] = MAX(a[(*it).first][T + (*it).second], a[i][T] + cast[(*it).first][T + (*it).second]);
		}
	}

	for (i = 1; i <= P; i++) {
		scanf("%d %d", &x, &T);

		printf("%d\n", a[x][T]);
	}

fclose(stdin);
fclose(stdout);
return 0;
}