Cod sursa(job #683200)

Utilizator eukristianCristian L. eukristian Data 20 februarie 2012 10:11:11
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>

#define MAXN 151
#define MAXT 3501

typedef struct tagNode {
	short key, tmp;
	tagNode *next;
} node;

node *graph[MAXN];
int amenzi[MAXN][MAXT];
int N, M, K, P;

int dyn[MAXN][MAXT];

void add(int a, int b, short tmp);
void read();
void solve();

int main()
{
	read();
	solve();
	
	freopen("amenzi.out", "w", stdout);
	for (int i = 1 ; i <= P ; ++i)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		printf("%d\n", dyn[a][b]);
	}
	
	return 0;
}

void add(int a, int b, short tmp)
{
	node *q = new node;
	q->key = a;
	q->tmp = tmp;
	q->next = graph[b];
	graph[b] = q;
	
	q = new node;
	q->key = b;
	q->tmp = tmp;
	q->next = graph[a];
	graph[a] = q;
}

void read()
{
	freopen("amenzi.in", "r", stdin);
	
	scanf("%d%d%d%d", &N, &M, &K, &P);
	
	for (int i = 1 ; i <= M ; ++i)
	{
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		add(a, b, c);
	}
	
	for (int i = 1 ; i <= K ; ++i)
	{
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		amenzi[a][b] += c;
	}
}

void solve()
{
	
	dyn[1][0] = amenzi[1][0];
	for (int i = 2 ; i <= N ; ++i)
		dyn[i][0] = -1;
		
	for (int t = 1 ; t <= MAXT ; ++t)
	{
		for (int i = 1 ; i <= N ; ++i)
		{
			dyn[i][t] = dyn[i][t - 1];
			node *q = graph[i];
			while (q)
			{
				if (t >= q->tmp && dyn[q->key][t - q->tmp] > dyn[i][t])
					dyn[i][t] = dyn[q->key][t - q->key];
				
				q = q->next;
			}
			
			if (dyn[i][t] != -1 && amenzi[i][t] != 0)
				dyn[i][t] += amenzi[i][t];
		}
	}
	
}