Cod sursa(job #11558)

Utilizator azotlichidAdrian Vladu azotlichid Data 31 ianuarie 2007 21:05:26
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;

#define FOR(i, a, b) for (i = (a); i <= (b); i ++)
#define REP(i, n)    for (i =   0; i <  (n); i ++)
#define MP			 make_pair
#define PB			 push_back

#define TMAX 3505
#define NMAX 155

int N, M, K, P, i, j, k, stp;
int a[TMAX][NMAX], m[TMAX][NMAX];
vector<pair<int, int> > adj[NMAX];

int main(void)
{
	freopen("amenzi.in", "r", stdin);
	freopen("amenzi.out", "w", stdout);
	scanf("%d %d %d %d", &N, &M, &K, &P);
	REP(stp, M)
	{
		scanf("%d %d %d", &i, &j, &k);
		adj[i].PB(MP(j, k)), adj[j].PB(MP(i, k));
	}

	memset(a, 0, sizeof(a));
	REP(stp, K)
	{
		scanf("%d %d %d", &i, &j, &k);
		a[j][i] += k;
	}

	memset(m, 0xFF, sizeof(m));
	m[0][1] = a[0][1];
	FOR(i, 1, 3500)
		FOR(j, 1, N)
		{
			if (m[i - 1][j] != -1) m[i][j] = m[i - 1][j] + a[i][j];
			for (vector<pair<int, int> > :: iterator it = adj[j].begin(); it != adj[j].end(); it ++)
				if (i - it->second >= 0 && m[i - it->second][it->first] != -1 && m[i - it->second][it->first] + a[i][j] > m[i][j])
					m[i][j] = m[i - it->second][it->first] + a[i][j];
		}

	REP(stp, P)
	{
		scanf("%d %d", &i, &j);
		printf("%d\n", m[j][i]);
	}

	return 0;
}