Cod sursa(job #683212)

Utilizator eukristianCristian L. eukristian Data 20 februarie 2012 10:46:34
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <vector>
#define MAXN 151
#define MAXT 3501

using std::vector;
using std::pair;
using std::make_pair;
/*
struct node {
	int key, tmp;
	node *next;
};

node *graph[MAXN];*/

vector<pair<int, int> > gr[MAXN];
int amenzi[MAXN][MAXT];
int N, M, K, P;

int dyn[MAXN][MAXT];

//void add(int a, int b, int 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, int 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);
		
		gr[a].push_back(make_pair(b,c));
		gr[b].push_back(make_pair(a,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;
			}
			*/
			
			for (vector<pair<int,int> >::iterator it = gr[i].begin() ; it != gr[i].end() ; it++)
			{
				if (t >= it->second && dyn[it->first][t - it->second] > dyn[i][t])
					dyn[i][t] = dyn[it->first][t - it->second];
			}
			
			if (dyn[i][t] != -1 && amenzi[i][t] != 0)
				dyn[i][t] += amenzi[i][t];
		}
	}
	
}