addition: dijkstar printing

This commit is contained in:
2026-05-06 22:29:22 -06:00
parent a20e77c09a
commit 19d1c2d984
4 changed files with 134 additions and 3 deletions

View File

@@ -41,4 +41,7 @@ GraphErr graph_vertex_count(Graph *graph, size_t *out);
GraphErr graph_get_vertex(Graph *graph, size_t index, Vertex *out); GraphErr graph_get_vertex(Graph *graph, size_t index, Vertex *out);
GraphErr graph_dijkstra(Graph *graph, size_t source, DijkstraResult *result); GraphErr graph_dijkstra(Graph *graph, size_t source, DijkstraResult *result);
void graph_print(Graph *graph);
void dijkstra_print_result(DijkstraResult *result);
#endif #endif

View File

@@ -5,6 +5,7 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
struct Vertex { struct Vertex {
ArrayList *edges; ArrayList *edges;
@@ -38,7 +39,7 @@ Graph *graph_create(GraphType type) {
} }
GraphErr graph_destroy(Graph **graph) { GraphErr graph_destroy(Graph **graph) {
if (graph == NULL || *graph) { if (graph == NULL || *graph == NULL) {
return GRAPH_NULL_ARG; return GRAPH_NULL_ARG;
} }
@@ -52,6 +53,7 @@ GraphErr graph_destroy(Graph **graph) {
arraylist_destroy(&(*graph)->vertices); arraylist_destroy(&(*graph)->vertices);
free(*graph);
*graph = NULL; *graph = NULL;
return GRAPH_OK; return GRAPH_OK;
@@ -143,9 +145,9 @@ GraphErr graph_dijkstra(Graph *graph, size_t source, DijkstraResult *result) {
ArrayList *prev = arraylist_init(vertex_count, sizeof(size_t)); ArrayList *prev = arraylist_init(vertex_count, sizeof(size_t));
for (size_t i = 0; i < vertex_count; i++) { for (size_t i = 0; i < vertex_count; i++) {
arraylist_push_back(distances, SIZE_MAX); arraylist_push_back(distances, &(size_t){SIZE_MAX});
arraylist_push_back(visited, false); arraylist_push_back(visited, false);
arraylist_push_back(prev, SIZE_MAX); arraylist_push_back(prev, &(size_t){SIZE_MAX});
} }
arraylist_set(distances, source, &(size_t){0}); arraylist_set(distances, source, &(size_t){0});
@@ -204,3 +206,95 @@ GraphErr graph_dijkstra(Graph *graph, size_t source, DijkstraResult *result) {
return GRAPH_OK; return GRAPH_OK;
} }
void graph_print(Graph *graph) {
if (graph == NULL) {
return;
}
size_t vertex_count = arraylist_size(graph->vertices);
printf("Graph {\n");
for (size_t i = 0; i < vertex_count; i++) {
Vertex vertex;
arraylist_get(graph->vertices, i, &vertex);
printf(" [%zu] -> ", i);
size_t edge_count = arraylist_size(vertex.edges);
for (size_t j = 0; j < edge_count; j++) {
Edge edge;
arraylist_get(vertex.edges, j, &edge);
printf("(%zu, w=%zu)", edge.to, edge.weight);
if (j + 1 < edge_count) {
printf(" -> ");
}
}
printf("\n");
}
printf("}\n");
}
void dijkstra_print_result(DijkstraResult *result) {
if (result == NULL) {
return;
}
size_t count = arraylist_size(result->distances);
printf("Dijkstra Result {\n");
for (size_t i = 0; i < count; i++) {
size_t dist;
arraylist_get(result->distances, i, &dist);
printf(" [%zu] ", i);
if (dist == SIZE_MAX) {
printf("dist=INF\n");
continue;
}
printf("dist=%zu ", dist);
size_t path[count];
size_t path_len = 0;
size_t current = i;
while (current != SIZE_MAX) {
path[path_len++] = current;
size_t next;
arraylist_get(result->prev, current, &next);
current = next;
}
printf("path= ");
for (size_t j = path_len; j > 0; j--) {
printf("%zu", path[j - 1]);
if (j > 1) {
printf(" -> ");
}
}
printf("\n");
}
printf("}\n");
}

View File

@@ -1,5 +1,34 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
#include "graph.h"
int main(void) { int main(void) {
Graph *graph = graph_create(GRAPH_UNDIRECTED);
graph_add_vertex(graph);
graph_add_vertex(graph);
graph_add_vertex(graph);
graph_add_vertex(graph);
graph_add_vertex(graph);
graph_add_vertex(graph);
graph_connect_vertex(graph, 0, 1, 9);
graph_connect_vertex(graph, 0, 2, 4);
graph_connect_vertex(graph, 1, 2, 2);
graph_connect_vertex(graph, 1, 4, 3);
graph_connect_vertex(graph, 1, 3, 7);
graph_connect_vertex(graph, 2, 3, 1);
graph_connect_vertex(graph, 2, 4, 6);
graph_connect_vertex(graph, 3, 4, 4);
graph_connect_vertex(graph, 3, 5, 8);
graph_connect_vertex(graph, 4, 5, 2);
DijkstraResult result;
graph_dijkstra(graph, 0, &result);
puts("Algoritmo de dijsktra");
graph_print(graph);
dijkstra_print_result(&result);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -0,0 +1,5 @@
#include <stdlib.h>
int main(void) {
return EXIT_SUCCESS;
}