Initial commit
This commit is contained in:
9
.clang-format
Normal file
9
.clang-format
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# We'll use defaults from the LLVM style, but with some modifications so that it's close to the CDT K&R style.
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
UseTab: Always
|
||||||
|
IndentWidth: 4
|
||||||
|
TabWidth: 4
|
||||||
|
PackConstructorInitializers: NextLineOnly
|
||||||
|
BreakConstructorInitializers: AfterColon
|
||||||
|
IndentAccessModifiers: false
|
||||||
|
AccessModifierOffset: -4
|
||||||
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
bin/
|
||||||
|
build/
|
||||||
|
|
||||||
|
.settings/
|
||||||
|
.cproject
|
||||||
|
.project
|
||||||
|
.clangd
|
||||||
|
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
38
Makefile
Normal file
38
Makefile
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Compilador
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -Wall -Wextra -g -Iincludes $(shell sdl2-config --cflags)
|
||||||
|
LDFLAGS = $(shell sdl2-config --libs) -lm
|
||||||
|
|
||||||
|
# Carpetas
|
||||||
|
SRC_DIR = src
|
||||||
|
OBJ_DIR = build
|
||||||
|
BIN_DIR = bin
|
||||||
|
|
||||||
|
# Fuentes y objetos
|
||||||
|
SRC = $(wildcard $(SRC_DIR)/*.c)
|
||||||
|
OBJ = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC))
|
||||||
|
TARGET = $(BIN_DIR)/graphs
|
||||||
|
|
||||||
|
# Regla por defecto
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
# Linkar el ejecutable
|
||||||
|
$(TARGET): $(OBJ) | $(BIN_DIR)
|
||||||
|
$(CC) -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
# Compilar cada .c a .o en build/
|
||||||
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
|
||||||
|
$(CC) -c $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
# Crear carpetas si no existen
|
||||||
|
$(OBJ_DIR):
|
||||||
|
mkdir -p $(OBJ_DIR)
|
||||||
|
|
||||||
|
$(BIN_DIR):
|
||||||
|
mkdir -p $(BIN_DIR)
|
||||||
|
|
||||||
|
# Limpiar objetos y binario
|
||||||
|
clean:
|
||||||
|
rm -rf $(OBJ_DIR)/* $(BIN_DIR)/*
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
150
src/graph.c
Normal file
150
src/graph.c
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
/*
|
||||||
|
* graphs.c
|
||||||
|
*
|
||||||
|
* Created on: 29 dic 2025
|
||||||
|
* Author: jomaa
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "graph.h"
|
||||||
|
|
||||||
|
Graph_t *create_graph(int num_vertices, GraphDirection_t direction,
|
||||||
|
GraphMultiplicity_t multiplicity, GraphType_t type)
|
||||||
|
{
|
||||||
|
Graph_t *graph = malloc(sizeof(Graph_t));
|
||||||
|
if(!graph) return NULL;
|
||||||
|
|
||||||
|
graph->num_vertices = num_vertices;
|
||||||
|
|
||||||
|
graph->vertices = malloc(num_vertices * sizeof(*graph->vertices));
|
||||||
|
if(!graph->vertices) {
|
||||||
|
free(graph);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < num_vertices; i++) {
|
||||||
|
graph->vertices[i].id = i;
|
||||||
|
graph->vertices[i].edges = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
graph->direction = direction;
|
||||||
|
graph->multiplicity = multiplicity;
|
||||||
|
graph->type = type;
|
||||||
|
|
||||||
|
return graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
int add_edge(Graph_t *g, int u, int v)
|
||||||
|
{
|
||||||
|
Edge_t *new_edge;
|
||||||
|
if(!g) return -EINVAL;
|
||||||
|
|
||||||
|
if(u < 0 || v < 0
|
||||||
|
|| u >= g->num_vertices || v >= g->num_vertices)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
new_edge = malloc(sizeof(Edge_t));
|
||||||
|
if(!new_edge) return -ENOMEM;
|
||||||
|
|
||||||
|
new_edge->to = &g->vertices[v];
|
||||||
|
new_edge->next = g->vertices[u].edges;
|
||||||
|
g->vertices[u].edges = new_edge;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_num_edges(Graph_t *g)
|
||||||
|
{
|
||||||
|
if (!g) return -EINVAL;
|
||||||
|
|
||||||
|
int num = 0;
|
||||||
|
int n = g->num_vertices;
|
||||||
|
bool **visited = malloc(n * sizeof(bool*));
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
visited[i] = calloc(n, sizeof(bool));
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Edge_t *e = g->vertices[i].edges;
|
||||||
|
while (e) {
|
||||||
|
int u = g->vertices[i].id;
|
||||||
|
int v = e->to->id;
|
||||||
|
if (g->direction == GRAPH_DIRECTED || !visited[u][v]) {
|
||||||
|
num++;
|
||||||
|
if (g->direction == GRAPH_UNDIRECTED)
|
||||||
|
visited[u][v] = visited[v][u] = true;
|
||||||
|
}
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
free(visited[i]);
|
||||||
|
free(visited);
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int distance(Graph_t *g, int u, int v)
|
||||||
|
{
|
||||||
|
if (!g) return -EINVAL;
|
||||||
|
if (u < 0 || u >= g->num_vertices || v < 0 || v >= g->num_vertices) return -EINVAL;
|
||||||
|
|
||||||
|
int n = g->num_vertices;
|
||||||
|
int *dist = malloc(n * sizeof(int));
|
||||||
|
bool *visited = malloc(n * sizeof(bool));
|
||||||
|
|
||||||
|
// inicialización de la matriz binaria y de las distancias
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
dist[i] = INT_MAX;
|
||||||
|
visited[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dist[u] = 0;
|
||||||
|
visited[u] = true;
|
||||||
|
|
||||||
|
// cola para BFS
|
||||||
|
int *queue = malloc(n * sizeof(int));
|
||||||
|
int front = 0, back = 0;
|
||||||
|
queue[back++] = u;
|
||||||
|
|
||||||
|
while (front < back) {
|
||||||
|
int curr = queue[front++];
|
||||||
|
Edge_t *e = g->vertices[curr].edges;
|
||||||
|
while (e) {
|
||||||
|
int nei = e->to->id;
|
||||||
|
if (!visited[nei]) {
|
||||||
|
visited[nei] = true;
|
||||||
|
dist[nei] = dist[curr] + 1;
|
||||||
|
queue[back++] = nei;
|
||||||
|
}
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int steps = dist[v];
|
||||||
|
if (steps == INT_MAX) steps = -1; // no hay camino
|
||||||
|
|
||||||
|
free(dist);
|
||||||
|
free(visited);
|
||||||
|
free(queue);
|
||||||
|
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
int free_graph(Graph_t *g)
|
||||||
|
{
|
||||||
|
if (!g) return -EINVAL;
|
||||||
|
|
||||||
|
for(int i = 0; i < g->num_vertices; i++) {
|
||||||
|
Edge_t *e = g->vertices[i].edges;
|
||||||
|
while (e) {
|
||||||
|
Edge_t *next = e->next;
|
||||||
|
free(e);
|
||||||
|
e = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(g->vertices);
|
||||||
|
free(g);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
62
src/graph.h
Normal file
62
src/graph.h
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* graphs.h
|
||||||
|
*
|
||||||
|
* Created on: 29 dic 2025
|
||||||
|
* Author: jomaa
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRAPH_H_
|
||||||
|
#define GRAPH_H_
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
typedef enum GraphDirection_t {
|
||||||
|
GRAPH_DIRECTED,
|
||||||
|
GRAPH_UNDIRECTED
|
||||||
|
} GraphDirection_t;
|
||||||
|
|
||||||
|
typedef enum GraphMultiplicity_t {
|
||||||
|
GRAPH_SIMPLE,
|
||||||
|
GRAPH_MULTI
|
||||||
|
} GraphMultiplicity_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GRAPH_TYPE_PETERSEN,
|
||||||
|
GRAPH_TYPE_CYCLE,
|
||||||
|
GRAPH_TYPE_COMPLETE,
|
||||||
|
GRAPH_TYPE_BIPARTITE
|
||||||
|
} GraphType_t;
|
||||||
|
|
||||||
|
typedef struct Edge_t {
|
||||||
|
struct Vertex_t *to;
|
||||||
|
struct Edge_t *next;
|
||||||
|
} Edge_t;
|
||||||
|
|
||||||
|
typedef struct Vertex_t {
|
||||||
|
int id;
|
||||||
|
struct Edge_t *edges;
|
||||||
|
} Vertex_t;
|
||||||
|
|
||||||
|
typedef struct Graph_t {
|
||||||
|
int num_vertices;
|
||||||
|
Vertex_t *vertices;
|
||||||
|
GraphDirection_t direction;
|
||||||
|
GraphMultiplicity_t multiplicity;
|
||||||
|
GraphType_t type;
|
||||||
|
} Graph_t;
|
||||||
|
|
||||||
|
Graph_t *create_graph(int num_vertices, GraphDirection_t direction,
|
||||||
|
GraphMultiplicity_t multiplicity, GraphType_t type);
|
||||||
|
|
||||||
|
int add_edge(Graph_t *g, int u, int v);
|
||||||
|
|
||||||
|
int get_num_edges(Graph_t *g);
|
||||||
|
|
||||||
|
int distance(Graph_t *g, int u, int v);
|
||||||
|
|
||||||
|
int free_graph(Graph_t *g);
|
||||||
|
|
||||||
|
#endif /* GRAPH_H_ */
|
||||||
30
src/graphs.c
Normal file
30
src/graphs.c
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* graphs.c
|
||||||
|
*
|
||||||
|
* Created on: 29 dic 2025
|
||||||
|
* Author: jomaa
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "graphs.h"
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
Graph_t *petersen_graph = create_graph(10, GRAPH_UNDIRECTED, GRAPH_SIMPLE,
|
||||||
|
GRAPH_TYPE_PETERSEN);
|
||||||
|
if (!petersen_graph) return EXIT_FAILURE;
|
||||||
|
|
||||||
|
int edges[15][2] = {
|
||||||
|
{0,1},{0,4},{0,5},{1,2},{1,6},{2,3},{2,7},{3,4},{3,8},
|
||||||
|
{4,9},{5,7},{5,8},{6,8},{6,9},{7,9}
|
||||||
|
};
|
||||||
|
for (int i=0;i<15;i++) {
|
||||||
|
add_edge(petersen_graph, edges[i][0], edges[i][1]);
|
||||||
|
add_edge(petersen_graph, edges[i][1], edges[i][0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("El número de aristas de P es: %d\r\n", get_num_edges(petersen_graph));
|
||||||
|
printf("La distancia entre los vértices 2 y 8 es: %d\r\n", distance(petersen_graph, 2, 8));
|
||||||
|
|
||||||
|
free_graph(petersen_graph);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
14
src/graphs.h
Normal file
14
src/graphs.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* graphs.h
|
||||||
|
*
|
||||||
|
* Created on: 29 dic 2025
|
||||||
|
* Author: jomaa
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRAPHS_H_
|
||||||
|
#define GRAPHS_H_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "graph.h"
|
||||||
|
|
||||||
|
#endif /* GRAPHS_H_ */
|
||||||
38
src/metric_dimension.c
Normal file
38
src/metric_dimension.c
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* metric_dimension.c
|
||||||
|
*
|
||||||
|
* Created on: 29 dic 2025
|
||||||
|
* Author: jomaa
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "metric_dimension.h"
|
||||||
|
|
||||||
|
VertexSet_t *metric_base(Graph_t *g)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int metric_dimension(Graph_t *g)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_resolving_set(Graph_t *g, VertexSet_t *set)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_vertex_set(VertexSet_t *set)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < set->size; i++) {
|
||||||
|
Edge_t *e = set->vertices[i].edges;
|
||||||
|
while (e) {
|
||||||
|
Edge_t *next = e->next;
|
||||||
|
free(e);
|
||||||
|
e = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(set->vertices);
|
||||||
|
free(set);
|
||||||
|
}
|
||||||
23
src/metric_dimension.h
Normal file
23
src/metric_dimension.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* metric_dimension.h
|
||||||
|
*
|
||||||
|
* Created on: 29 dic 2025
|
||||||
|
* Author: jomaa
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef METRIC_DIMENSION_H_
|
||||||
|
#define METRIC_DIMENSION_H_
|
||||||
|
|
||||||
|
#include "graph.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int size;
|
||||||
|
Vertex_t *vertices;
|
||||||
|
} VertexSet_t;
|
||||||
|
|
||||||
|
VertexSet_t *metric_base(Graph_t *g);
|
||||||
|
int metric_dimension(Graph_t *g);
|
||||||
|
int is_resolving_set(Graph_t *g, VertexSet_t *set);
|
||||||
|
void free_vertex_set(VertexSet_t *set);
|
||||||
|
|
||||||
|
#endif /* METRIC_DIMENSION_H_ */
|
||||||
Reference in New Issue
Block a user