Cod sursa(job #208493)

Utilizator andrei.12Andrei Parvu andrei.12 Data 16 septembrie 2008 19:52:55
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<stdio.h>
#include<vector>

using namespace std;

#define x first
#define y second

int n, m, k, p, i, j, i1, x, y, cs, cst[3505][155], d[3505][155];
vector< pair<int, int> > v[155];

int main()
{
	freopen("amenzi.in", "rt", stdin);
	freopen("amenzi.out", "wt", stdout);

	scanf("%d%d%d%d", &n, &m, &k, &p);
	for (i = 1; i <= m; i ++){
		scanf("%d%d%d", &x, &y, &cs);

		v[x].push_back(make_pair(y, cs)), v[y].push_back(make_pair(x, cs));
	}
	for (i = 1; i <= k; i ++){
		scanf("%d%d%d", &x, &y, &cs);

		cst[y][x] += cs;
	}

	memset(d, 0xff, sizeof(d));
	d[0][1] = 0;
	for (i = 0; i <= 3500; i ++)
		for (j = 1; j <= n; j ++)
			if (d[i][j] != -1){
				d[i][j] += cst[i][j];
				d[i+1][j] = max(d[i+1][j], d[i][j]);

				for (i1 = 0; i1 < (int)v[j].size(); i1 ++)
					if (i + v[j][i1].y <= 3500)
						d[i + v[j][i1].y][v[j][i1].x] = max(d[i + v[j][i1].y][v[j][i1].x], d[i][j]);
			}

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

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

	return 0;
}