Cod sursa(job #9549)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 27 ianuarie 2007 16:08:29
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 1.73 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;
char used[MAXN][MAXT];
short infrac[MAXN][MAXT];
int best[MAXN][MAXT];

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[i][j] += (short)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(i, j) );
	}

	for (Q.push( make_pair(1, 0) ); !Q.empty(); Q.pop())
	{
		int cur = Q.front().first, T = Q.front().second, C = best[cur][T];
		int _cur, _T, _C;

		
		if (T + 1 <= TMAX)
		{
			_cur = cur;
			_T = T + 1;
			_C = C + infrac[_cur][_T];
			if (_C > best[_cur][_T])
			{
				best[_cur][_T] = _C;
				if (!used[_cur][_T])
				{
					Q.push( make_pair( _cur, _T ) );
					used[_cur][_T] = 1;
				}
			}
		}

		vector< pair<int, int> > :: iterator it;
		for (it = con[cur].begin(); it != con[cur].end(); it++)
		{
			_cur = (*it).first;
			_T = T + (*it).second;
			if (_T > TMAX)
				continue;
			_C = C + infrac[_cur][_T];
			if (_C > best[_cur][_T])
			{
				best[_cur][_T] = _C;
				if (!used[_cur][_T])
				{
					Q.push( make_pair( _cur, _T ) );
					used[_cur][_T] = 1;
				}
			}	
		}

		used[cur][T] = 0;
	}

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