Cod sursa(job #9878)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 27 ianuarie 2007 18:44:32
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define MAXN 155
#define MAXT 3505

int N, M, K, P;
vector< pair<int, int> > con[MAXN];
int TMAX = -1;

int infrac[MAXT][MAXN];
int best[MAXT][MAXN];

vector< pair<int, int> > query;

queue< pair<int, int> > Q;

int main()
{
	freopen("amenzi.in", "rt", stdin);
	freopen("amenzi.out", "wt", stdout);
	scanf("%d %d %d %d", &N, &M, &K, &P);
	for (; M; M--)
	{
		int i, j, k;
		scanf("%d %d %d", &i, &j, &k);
		con[i].push_back( make_pair(j, k) );
		con[j].push_back( make_pair(i, k) );
		if (k > TMAX)
			TMAX = k;
	}

	for (; K; K--)
	{
		int i, j, k;
		scanf("%d %d %d", &i, &j, &k);
		infrac[j][i] += k;
	}

	for (int k = 0; k < P; k++)
	{
		int i, j;
		scanf("%d %d", &i, &j);
		if (j > TMAX)
			TMAX = j;
		query.push_back( make_pair(j, i) );
	}

	memset(best, -1, sizeof(best));
	best[0][1] = infrac[0][1];
	for (int i = 0; i <= TMAX; i++)
		for (int j = 1; j <= N; j++)
		{
			if (best[i][j] == -1)
				continue;
			if (best[i][j] + infrac[i + 1][j] > best[i + 1][j])
				best[i + 1][j] = best[i][j] + infrac[i + 1][j];

			vector< pair<int, int> > :: iterator it;
			for (it = con[j].begin(); it != con[j].end(); it++)
			{
				int nxt, nxtT, nxtC;
				nxt = (*it).first;
				nxtT = i + (*it).second;
				nxtC = best[i][j] + infrac[nxtT][nxt];
				if (nxtC > best[nxtT][nxt])
					best[nxtT][nxt] = nxtC;
			}
		}

	for (int i = 0; i < P; i++)
		printf("%d\n", best[ query[i].first ][ query[i].second ]);
	return 0;
}