Cod sursa(job #9555)

Utilizator TYTUSVlad Saveluc TYTUS Data 27 ianuarie 2007 16:10:14
Problema Amenzi Scor 60
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 2.25 kb
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;

const int NMAX = 151;
const int INFI = 1<<28;
const int EMAX = 20000; //Numarul maxim de evenimente
int mat[NMAX][NMAX];
int ans[8001];

class event {
	public:
	int t, a, s; //Daca e intalnire cu nevasta s < 0
	event() {
	}
	event(int x, int y, int z) {
		t = x;
		a = y;
		s = z;
	}
}v[EMAX + 1];
	
	
struct cmpByTime {
	bool operator()(const event a, const event b) {
		if (a.t == b.t) {
			return a.s > b.s ? true: false;
		}
		return a.t < b.t ? true: false;
	}
};

struct cmpByProfit { //Folosit 
	bool operator()(const event a, const event b) {
		return a.s > b.s;
	}
};


set<event, cmpByProfit>s;

int main() {
	FILE *fin = fopen ("amenzi.in", "r");
	FILE *fout= fopen ("amenzi.out", "w");
	int N, M, K, P, i, j, k;
	fscanf (fin, "%d %d %d %d", &N, &M, &K, &P);
	for (i = 1; i <= N; ++i) {
		for (j = 1; j <= N; ++j) {
			mat[i][j] = INFI;
		}
		mat[i][i] = 0;
	}
	while (M--) {
		int a, b, c;
		fscanf (fin, "%d %d %d", &a, &b, &c);
		if (mat[a][b] > c) {
			mat[a][b] = c;
			mat[b][a] = c;
		}
	}
	//Floyd - Warshall
	for (k = 1; k <= N; ++k) {
		for (i = 1; i <= N; ++i) {
			for (j = 1; j <= N; ++j) {
				if (mat[i][k] + mat[k][j] < mat[i][j]) {
					mat[i][j] = mat[i][k] + mat[k][j];
				}
			}
		}
	}
	//Citesc restul datelor
	for (i = 0; i < K; ++i) {
		fscanf (fin, "%d %d %d", &v[i].a, &v[i].t, &v[i].s);
	}
	for (i = 0; i < P; ++i) {
		fscanf (fin, "%d %d", &v[i + K].a, &v[i + K].t);
		v[i + K].s = -(i + 1);
	}
	//
	v[K + P] = event(0, 1, 0);
	sort(v, v + K + P + 1, cmpByTime());
	//
	s.insert(event(0, 1, 0));
	for (i = 1; i <= K + P; ++i) {
// 		printf ("Processing (%d, %d, %d)\n", v[i].a, v[i].t, v[i].s);
		int totalSum = -1;
		set<event>::iterator it;
		for (it = s.begin(); it != s.end() && totalSum == -1; ++it) {
			if (it->t + mat[it->a][v[i].a] <= v[i].t) {
				totalSum = it->s;
// 				printf ("From %d, %d, %d to %d, %d\n", it->t, it->a, it->s, v[i].a, v[i].t);
			}
		}
		if (v[i].s > 0) {
			if (totalSum > -1) {
// 				printf ("Add %d, %d, %d\n", v[i].t, v[i].a, v[i].s + totalSum);
				s.insert(event(v[i].t, v[i].a, v[i].s + totalSum));
			}
		} else {
			ans[-(v[i].s)] = totalSum;
		}
	}
	for (i = 1; i <= P; ++i) {
		fprintf (fout, "%d\n", ans[i]);
	}
	fclose(fout);
	return 0;
}