Pagini recente » Arbori de intervale si aplicatii in geometria computationala | Cod sursa (job #2586985) | Autentificare | Cod sursa (job #2956784) | Cod sursa (job #175864)
Cod sursa(job #175864)
#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;
}