Cod sursa(job #390180)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 3 februarie 2010 11:27:55
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <vector>

#define TMAX 3501
#define NMAX 152
#define PMAX 8012
using namespace std;

struct nod{ int c, n; };
struct sotie{ int inters, timp; };

sotie Sot[PMAX];
vector<nod> A[NMAX];
int N, M, K, P;
int D[TMAX][NMAX], AM[TMAX][NMAX];


void Citeste(void)
{
	ifstream fin("amenzi.in");
	
	int i, x, y;
	nod a;
	
	fin >>N >>M >>K >>P;
	
	for (i = 1; i <= M; i++)
	{
		fin >>x >>y >>a.c;
		a.n = y;
		A[x].push_back(a);
		a.n = x;
		A[y].push_back(a);
	}
	
	for (i = 1; i <= K; i++)
	{
		fin >>x >>y >>a.c;
		AM[y][x] = a.c;
	}
	
	for (i = 1; i <= P; i++)
		fin >>Sot[i].inters >>Sot[i].timp;
	fin.close();
}

void Rezolva(void)
{
	int i, j, t;
	for (i = 1; i <= N; i++)
		D[0][i] = -1;
	D[0][1] = 1;
	
	for (t = 1; t < TMAX; t++)
		for (i = 1; i <= N; i++)
		{
			D[t][i] = D[t-1][i];
			for (j = 0; j < A[i].size(); j++)
				if (t - A[i][j].c >= 0 && D[t - A[i][j].c][A[i][j].n] > D[t][i])
					D[t][i] = D[t - A[i][j].c][A[i][j].n];
				
			if (D[t][i] != -1)
				D[t][i] += AM[t][i];
		}
}

void Afiseaza(void)
{
	ofstream fout("amenzi.out");
	
	int i;
	for (i = 1; i <= P; i++)
		fout <<D[Sot[i].timp][Sot[i].inters] - 1 <<'\n';
	
	fout.close();
}

int main()
{
	Citeste();
	
	Rezolva();
	
	Afiseaza();
}