Cod sursa(job #9871)

Utilizator wefgefAndrei Grigorean wefgef Data 27 ianuarie 2007 18:41:20
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

#define pb push_back
#define sz size()

#define inf 1000000000 //un miliard
#define Nmax 155
#define Tmax 3505
#define Kmax 12005
#define Pmax 8005

struct infr
{
	int nod, timp, val;
} A[Kmax], B[Pmax];

int n, m, K, p;
int c[Nmax][Nmax];
int v[Tmax][Nmax];

vector<int> vec[Nmax];

void readdata()
{
	freopen("amenzi.in", "r", stdin);
	freopen("amenzi.out", "w", stdout);
	
	int i, j, a, b, val;
	scanf("%d %d %d %d", &n, &m, &K, &p);
	for (i = 1; i <= n; ++i)
		for (j = 1; j <= n; ++j)
			c[i][j] = inf;
	for (i = 0; i < m; ++i)
	{
		scanf("%d %d %d", &a, &b, &val);
		c[a][b] = min(c[a][b], val);
		c[b][a] = min(c[b][a], val);
	}
	for (i = 0; i < K; ++i)
		scanf("%d %d %d", &A[i].nod, &A[i].timp, &A[i].val);
	for (i = 0; i < p; ++i)
		scanf("%d %d", &B[i].nod, &B[i].timp);
}

int cmp(struct infr a, struct infr b)
{
	return a.timp < b.timp;
}

void solve()
{
	int i, j, k, nod, ia = 0, val;
	
	sort(A, A+K, cmp);
				
	v[0][1] = 0;
	for (i = 2; i <= n; ++i)
		v[0][i] = -1;
		
	while (ia < K && A[ia].timp == 0)
	{
		if (v[0][ A[ia].nod ] >-1) v[0][ A[ia].nod ] += A[ia].val;
		++ia;
	}		
		
	for (i = 1; i <= n; ++i)
		for (j = 1; j <= n; ++j)
			if (c[i][j] < inf) vec[i].pb(j);
		
	for (k = 1; k <= 3500; ++k)
	{
		for (i = 1; i <= n; ++i)
			v[k][i] = v[k-1][i];
			
		for (i = 1; i <= n; ++i)
			for (j = 0; j < vec[i].sz; ++j)
			{
				nod = vec[i][j];
				if (k-c[i][nod] >= 0 && v[ k-c[i][nod] ][nod] > -1)
					v[k][i] = max(v[ k-c[i][nod] ][nod], v[k][i]);
			}
			
		while (ia < K && A[ia].timp == k)
		{
			if (v[k][ A[ia].nod ] > -1) v[k][ A[ia].nod ] += A[ia].val;
			++ia;
		}
	}
	for (i = 0; i < p; ++i)
	{
		val = v[ B[i].timp ][ B[i].nod ];
		printf("%d\n", val);
	}
}

int main()
{
	readdata();
	solve();
	return 0;
}