Pagini recente » Cod sursa (job #1245503) | Cod sursa (job #2057714) | Cod sursa (job #1276449) | Cod sursa (job #2912668) | Cod sursa (job #1473090)
#include <stdio.h>
#define Smerenie 200050
#define Nadejde 30001
typedef struct {
int v, w, next;
} cell;
int N, M, X, Y;
int d[Nadejde];
int Q[Nadejde];
int qhead, qtail;
int adj[Nadejde];
cell l[Smerenie];
char seen[Nadejde];
/** Adauga-l pe "v" la lista de adiacenta a lui "u". **/
void addEdge(int u, int v, int w, int pos) {
l[pos].v = v;
l[pos].w = w;
l[pos].next = adj[u];
adj[u] = pos;
}
/** Pune in coada "u". **/
void enqueue(int u) {
Q[qtail++] = u;
}
/** Ia capul cozii. **/
void dequeue(int *u) {
(*u) = Q[qhead++];
}
/** Afla distanta de la "X" la "Y". **/
int bfs(int u) {
int v, pos;
enqueue(u);
seen[u] = 1;
do {
dequeue(&u);
for (pos = adj[u]; pos; pos = l[pos].next) {
v = l[pos].v;
if (!seen[v]) {
enqueue(v);
seen[v] = 1;
d[v] = d[u] + l[pos].w;
}
}
} while (qhead != qtail);
return d[Y];
}
int main(void) {
int i, u, v, w;
FILE *f = fopen("sate.in", "r");
/// Citeste graful.
fscanf(f, "%d %d %d %d", &N, &M, &X, &Y);
for (i = 1; i <= M; i++) {
fscanf(f, "%d %d %d", &u, &v, &w);
addEdge(u, v, w, i);
addEdge(v, u, -w, i + M);
}
fclose(f);
f = fopen("sate.out", "w");
/// Afiseaza rezultatul
fprintf(f, "%d\n", bfs(X));
fclose(f);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}