Pagini recente » Cod sursa (job #208797) | Cod sursa (job #1823854) | Cod sursa (job #2988707) | Cod sursa (job #921148) | Cod sursa (job #1464774)
#include <stdio.h>
#include <ctype.h>
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
#define MAX_Q 524287
#define Smerenie 500001
#define Nadejde 250001
#define Dragoste 65536
typedef struct {
int v, k, next;
} cell;
int N;
int M;
char c;
int qhead;
int qtail;
int adj[Nadejde];
cell l[Smerenie];
int Q[MAX_Q + 1];
int min[Nadejde];
int pos = Dragoste;
char buff[Dragoste];
char inQueue[Nadejde];
char getChar(FILE *f) {
if (pos == Dragoste) {
fread(buff, 1, Dragoste, f);
pos = 0;
}
return buff[pos++];
}
void freef(FILE *f, const char *arg, int *result) {
*result = 0;
do {
c = getChar(f);
} while (!isdigit(c));
do {
*result = (*result << 3) + (*result << 1) + c - '0';
c = getChar(f);
} while (isdigit(c));
}
void init() {
int i;
for (i = 1; i <= N; i++) {
min[i] = Nadejde;
}
}
void enqueue(int u) {
Q[qtail] = u;
qtail = (qtail + 1) & MAX_Q;
}
void dequeue(int *u) {
(*u) = Q[qhead];
qhead = (qhead + 1) & MAX_Q;
}
int Qempty() {
return (qhead == qtail);
}
int bfs(int b, int e) {
int v, k, pos, curr;
init();
min[b] = 0;
enqueue(b);
do {
dequeue(&b);
inQueue[b] = 0;
for (pos = adj[b]; pos; pos = l[pos].next) {
v = l[pos].v;
k = l[pos].k;
curr = MAX(min[b], k);
if (curr < min[v]) {
min[v] = curr;
if (!inQueue[v]) {
enqueue(v);
inQueue[v] = 1;
}
}
}
} while (!Qempty());
return min[e];
}
void addEdge(int u, int v, int k, int pos) {
l[pos].v = v;
l[pos].k = k;
l[pos].next = adj[u];
adj[u] = pos;
}
int main(void) {
int i, b, e, u, v, k;
FILE *f = fopen("pscnv.in", "r");
fscanf(f, "%d %d %d %d", &N, &M, &b, &e);
for (i = 1; i <= M; i++) {
freef(f, "%d", &u);
freef(f, "%d", &v);
freef(f, "%d", &k);
addEdge(u, v, k, i);
}
fclose(f);
f = fopen("pscnv.out", "w");
fprintf(f, "%d\n", bfs(b, e));
fclose(f);
puts("Doamne ajuta!");
return 0;
}