Cod sursa(job #175864)

Utilizator scvalexAlexandru Scvortov scvalex Data 10 aprilie 2008 15:50:29
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <list>

using namespace std;

typedef pair<int, int> pii;

int N, M, X, Y;
vector<pii> G[250001];
int C[250001];

list<int> L[1001];
list<int>::iterator last[250001];

void getval(char *buf, int *v) {
	int i(0),
		k(0),
		aux;

	while ((buf[i] != '\n') && buf[i]) {
		aux = 0;
		while ((buf[i] != ' ') && (buf[i] != '\n') && (buf[i] != 0))
			aux = aux * 10 + buf[i++] - '0';
		v[k++] = aux;
		while (buf[i] == ' ')
			++i;
	}
}

int main(int argc, char *argv[]) {
	FILE *fi = fopen("pscnv.in", "rt");
	char buf[32];
	int v[4];
	fgets(buf, 32, fi);
	getval(buf, v);
	N = v[0];
	M = v[1];
	X = v[2];
	Y = v[3];

	for (int i(0); i < M; ++i) {
		fgets(buf, 32, fi);
		getval(buf, v);
		G[v[0]].push_back(make_pair(v[1], v[2]));
	}
	fclose(fi);

	memset(C, -1, sizeof(C));
	C[X] = 0;
	L[0].push_back(X);
	for (int i(0); (i <= 1000) && ((C[Y] == -1) || (C[Y] >= i)); ++i)
		for (list<int>::iterator j = L[i].begin(); j != L[i].end(); ++j)
			for (vector<pii>::iterator k = G[*j].begin(); k != G[*j].end(); ++k) {
				int u = k->first,
					pon = k->second;
				if ((C[u] == -1) || ((C[u] > i) && (pon < C[u]))) {
					if (C[u] != -1)
						L[C[u]].erase(last[u]);
					int t = max(i, pon);
					C[u] = t;
					L[t].push_back(u);
					last[u] = --L[t].end();
				}
			}
	
	ofstream fout("pscnv.out");
	fout << C[Y] << endl;
	fout.close();

	return 0;
}