Cod sursa(job #136)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 5 decembrie 2006 15:13:39
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <list>
#include <vector>
#include <cstring>

using namespace std;

#define PB push_back
#define MP make_pair

const int NMAX = 250001;
const int KMAX = 1001;

int N, M, X, Y;
vector <pair <int, int> > G[NMAX];
list <int> L[KMAX];
list <int> :: iterator PN[NMAX];
int CT[NMAX];

void getval(char buf[], int v[]) {
	int i = 0, k = 0, aux;
	
	while (buf[i] != '\n' && buf[i] != 0) {
//		printf("%c\n", buf[i]);
		aux = 0;
		while (buf[i] != ' ' && buf[i] != '\n' && buf[i] != 0)
			aux = aux * 10 + buf[i++] - '0';
//		printf("%d ", aux);
		v[k++] = aux;
		while (buf[i] == ' ') ++i;
	}
}

void citire() {
	FILE *fin = fopen("pscnv.in", "rt");
	char buf[32];
	int v[4], i;

	fgets(buf, 32, fin);
	getval(buf, v);
//	printf("ok\n");
	N = v[0]; M = v[1];
	X = v[2]; Y = v[3];
	
	for (i = 0; i < M; ++i) {
		fgets(buf, 32, fin);
		getval(buf, v);
		G[v[0]].PB(MP(v[1], v[2]));
	}

	fclose(fin);
}

void compute() {
	int i, u, v, t;
	list <int> :: iterator j;
	vector <pair <int, int> > :: iterator k;

	memset(CT, 0xff, sizeof(CT));
	CT[X] = 0; L[0].PB(X);
	for (i = 0; i < KMAX && (CT[Y] == -1 || CT[Y] >= i); ++i)
		for (j = L[i].begin(); j != L[i].end(); ++j)
			for (k = G[*j].begin(); k != G[*j].end(); ++k) {
				u = (*k).first; v = (*k).second;
				if (CT[u] == -1 || (CT[u] > i && v < CT[u])) {
					if (CT[u] != -1)
						L[CT[u]].erase(PN[u]);
					t = max(i, v);
					CT[u] = t;
					L[t].PB(u);
					PN[u] = --L[t].end();
				}
			}
}

void afisare() {
	FILE *fout = fopen("pscnv.out", "wt");

	fprintf(fout, "%d\n", CT[Y]);

	fclose(fout);
}

int main() {
	citire();
	compute();
	afisare();
	return 0;
}