Anonymous user
Dijkstra's algorithm: Difference between revisions
→{{header|C}}: do not store vertex index in the vertex
(→{{header|C}}: no longer that extra test case) |
(→{{header|C}}: do not store vertex index in the vertex) |
||
Line 367:
#include <stdlib.h>
#include <limits.h>
#include <stdarg.h>
typedef struct {
Line 374 ⟶ 375:
typedef struct {
edge_t **
int
int
int hindex;▼
int dist;
int prev;
int visited;
▲ int hindex;
} vertex_t;
typedef struct {
vertex_t **
int
int
} graph_t;
typedef struct {
int len;
int size;
Line 397:
void add_vertex (graph_t *g, int i) {
if (g->
int size = g->
g->
for (int j = g->
g->
}
g->
}
if (!g->
g->
g->
g->vertex_len++;▼
}
}
Line 417 ⟶ 416:
add_vertex(g, a);
add_vertex(g, b);
vertex_t *v = g->
if (v->
v->
v->
}
edge_t *e = calloc(1, sizeof (edge_t));
e->vertex = b;
e->weight = w;
v->
}
void
int k = j
}
}
void push_heap (heap_t *h, graph_t *g, int i) {
vertex_t *v = g->vertices[i];
if (!v->hindex) {
if (h->len + 1 >= h->size) {
h->size = h->size ? h->size * 2 : 4;
h->
}
h->len++;
}
▲ while (i > 1 && h->vertex[j]->dist > v->dist) {
▲ h->vertex[i] = h->vertex[j];
▲ j = j / 2;
▲ v->hindex = i;
}
va_start(args, n);
return NULL;▼
int m = va_arg(args, int);
j = va_arg(args, int);
if (j > h->len)
vertex_t *v = g->vertices[h->vertices[m]];
vertex_t *u = g->vertices[h->vertices[j]];
}
va_end(args);
▲ vertex_t *v = h->vertex[1];
h->vertex[1] = h->vertex[h->len];▼
}
h->len--;▼
void down_heap (heap_t *h, graph_t *g) {
int k = h->vertices[1];
int i = 1;
while (1) {
int
▲ if (j <= h->len && h->vertex[j]->dist < h->vertex[k]->dist) {
▲ k = j;
▲ }
▲ k = j + 1;
▲ }
▲ if (k == i) {
break;
h->vertices[i] = h->vertices[j];
g->vertices[h->
▲ i = k;
}
h->
}
return v;▼
int pop_heap (heap_t *h, graph_t *g) {
int i = h->vertices[1];
▲ h->len--;
down_heap(h, g);
}
Line 485 ⟶ 502:
a = a - 'a';
b = b - 'a';
for (i = 0; i < g->
vertex_t *v = g->
v->dist = INT_MAX;
v->prev = 0;
v->visited = 0;
}
vertex_t *v = g->
heap_t *h = calloc(1, sizeof (heap_t));
push_heap(h, g
while (
if (
break;
v->visited = 1;
for (j = 0; j < v->
edge_t *e = v->
vertex_t *u = g->
if (!u->visited && v->dist + e->weight <= u->dist) {
u->prev =
u->dist = v->dist + e->weight;
push_heap(h,
}
}
Line 512 ⟶ 530:
}
void print_path (graph_t *g
vertex_t *v = g->
if (v->dist == INT_MAX) {
printf("no path\n");
return;
}
while
u = g->vertices[u->prev];
print_path(g, 'a' + v->prev, i + 1);▼
}
for (k = 0, u = v; k < j - 1; k++, u = g->vertices[u->prev]) {
}
printf("%d %.*s\n", v->dist, j, a);
}
Line 543 ⟶ 562:
add_edge(g, 'e', 'f', 9);
dijkstra(g, 'a', 'e');
print_path(g, 'e'
return 0;
}
|