Pagini recente » Cod sursa (job #3277570) | Cod sursa (job #2719458) | Cod sursa (job #421688) | Cod sursa (job #22361) | Cod sursa (job #136)
Cod sursa(job #136)
#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;
}