Graph - Grafos
Como usar la documentación
Para leer la guía de uso de la documentación, por favor diríjase a la sección Guía de documentación.
Elementos
vertex.py
- new_vertex(key, value)
Crea un nuevo vertice con la clave
key
y el valorvalue
.El vertice es creado con los siguientes atributos:
key
: Llave del vertice.value
: Valor del vertice.adjacents
: Lista de arcos adyacentes al vertice. Implementada como un mapa map_linear_probing.
- Parameters:
key (any) – Clave del vertice
value (any) – Valor del vertice
- Returns:
Vertice recien creado
- Return type:
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice vertex = V.new_vertex(1, {"nombre": "A"}) print(vertex) # Salida esperada: # { # 'key': 1, # 'value': { # 'nombre': 'A' # }, # 'adjacents': { # 'prime': 109345121, # 'capacity': 2, # 'scale': 96269727, # 'shift': 48310553, # 'table': { # 'elements': [ # { # 'key': None, # 'value': None # }, # { # 'key': None, # 'value': None # } # ], # 'size': 2 # }, # 'current_factor': 0, # 'limit_factor': 0.5, # 'size': 0 # } # } #
- get_key(vertex)
Retorna el
key
del verticevertex
.- Parameters:
vertex (vertex) – Vertice del cual se quiere obtener la clave
- Returns:
Clave del vertice
- Return type:
any
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice vertex = V.new_vertex(1, {"nombre": "A"}) print(V.get_key(vertex)) # Salida esperada: 1
- get_value(vertex)
Retorna el
value
del verticevertex
- Parameters:
vertex (vertex) – Vertice del cual se quiere obtener el valor
- Returns:
Valor del vertice
- Return type:
any
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice vertex = V.new_vertex(1, {"nombre": "A"}) print(V.get_value(vertex)) # Salida esperada: {'nombre': 'A'}
- set_value(vertex, new_value)
Cambia el
value
del verticevertex
por el valornew_value
- Parameters:
vertex (vertex) – Vertice al cual se le quiere cambiar el valor
value (any) – Nuevo valor del vertice
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice vertex = V.new_vertex(1, {"nombre": "A"}) print(V.get_value(vertex)) # Salida esperada: {'nombre': 'A'} # Cambiar el valor del vertice V.set_value(vertex, {"nombre": "B"}) print(V.get_value(vertex)) # Salida esperada: {'nombre': 'B'}
- get_adjacents(vertex)
Retorna el mapa con la lista de arcos<graph-edge>`del vertice ``vertex`
- Parameters:
vertex (vertex) – Vertice del cual se quiere obtener el mapa de arcos
- Returns:
Mapa de arcos del vertice
- Return type:
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice key_u = 1 key_v = 2 key_w = 3 vertex_u = V.new_vertex(key_u, {"nombre": "Vertice U"}) V.add_adjacent(key_u, key_v, 10) V.add_adjacent(key_u, key_w, 15) print(V.get_adjacents(vertex_u)) # Salida esperada: # { # 'prime': 109345121, # 'capacity': 5, # 'scale': 60497948, # 'shift': 74210530, # 'table': { # 'elements': [ # { # 'key': None, # 'value': None # }, # { # 'key': 'KEYV', # 'value': { # 'to': 'KEYV', # 'weight': 10 # } # }, # { # 'key': None, # 'value': None # }, # { # 'key': 'KEYW', # 'value': { # 'to': 'KEYW', # 'weight': 10 # } # }, # { # 'key': None, # 'value': None # } # ], # 'size': 5 # }, # 'current_factor': 0.4, # 'limit_factor': 0.5, # 'size': 2 # }
- get_edge(vertex, key_v)
Retorna el arco adyacente en el vertice
vertex
con la clavekey_v
Si no existe el arco, retorna None.- Parameters:
vertex (vertex) – Vertice del cual se quiere obtener el mapa de arcos
- Returns:
Mapa con la lista de arcos adyacentes vertice
- Return type:
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice key_u = "KEYU" key_v = "KEYV" key_w = "KEYW" vertex_u = V.new_vertex(key_u, {"nombre": "Vertice U"}) V.add_adjacent(vertex_u, key_v, 10) V.add_adjacent(vertex_u, key_w, 15) # Obtener el vertice adyacente print(V.get_edge(vertex_u, vertex_v)) # Salida esperada: {'to': 'KEYV', 'weight': 10} # Obtener el vertice no adyacente print(V.get_edge(vertex_u, "KEYX")) # Salida esperada: None
- add_adjacent(vertex, key_vertex, weight)
Agrega un arco al vertice
vertex
con el verticekey_vertex
y el pesoweight
- Parameters:
vertex (vertex) – Vertice al cual se le quiere agregar el arco
key_vertex (any) – Clave del vertice al cual se le quiere agregar el arco
weight (double) – Peso del arco
- Returns:
Vertice con el arco agregado
- Return type:
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice key_u = "KEYU" key_v = "KEYV" key_w = "KEYW" vertex_u = V.new_vertex(key_u, {"nombre": "Vertice U"}) vertex_u = V.add_adjacent(vertex_u, key_v, 10) print(vertex_u) # Salida esperada: # { # 'key': 'KEYU', # 'value': { # 'nombre': 'Vertice U' # }, # 'adjacents': { # 'prime': 109345121, # 'capacity': 5, # 'scale': 86271125, # 'shift': 104195991, # 'table': { # 'elements': [ # { # 'key': None, # 'value': None # }, # { # 'key': None, # 'value': None # }, # { # 'key': None, # 'value': None # }, # { # 'key': 'KEYV', # 'value': { # 'to': 'KEYV', # 'weight': 10 # } # }, # { # 'key': None, # 'value': None # } # ], # 'size': 5 # }, # 'current_factor': 0.2, # 'limit_factor': 0.5, # 'size': 1 # } # } # Agregar otro vertice adyacente vertex_u = V.add_adjacent(vertex_u, key_w, 15) print(vertex_u) # Salida esperada: # { # 'key': 'KEYU', # 'value': { # 'nombre': 'Vertice U' # }, # 'adjacents': { # 'prime': 109345121, # 'capacity': 5, # 'scale': 54639149, # 'shift': 57004010, # 'table': { # 'elements': [ # { # 'key': None, # 'value': None # }, # { # 'key': 'KEYV', # 'value': { # 'to': 'KEYV', # 'weight': 10 # } # }, # { # 'key': None, # 'value': None # }, # { # 'key': None, # 'value': None # }, # { # 'key': 'KEYW', # 'value': { # 'to': 'KEYW', # 'weight': 15 # } # } # ], # 'size': 5 # }, # 'current_factor': 0.4, # 'limit_factor': 0.5, # 'size': 2 # } # }
- degree(vertex)
Retorna el grado del vertice
vertex
.- Parameters:
vertex (vertex) – Vertice del cual se quiere obtener el grado
- Returns:
Grado del vertice
- Return type:
int
- Example:
# App/logic.py from DataStructures.Graph import vertex as V # Crear un nuevo vertice key_u = "KEYU" key_v = "KEYV" key_w = "KEYW" vertex_u = V.new_vertex(key_u, {"nombre": "Vertice U"}) vertex_u = V.add_adjacent(vertex_u, key_v, 10) print(V.degree(vertex_u)) # Salida esperada: 1 vertex_u = V.add_adjacent(vertex_u, key_w, 15) print(V.degree(vertex_u)) # Salida esperada: 2
edge.py
- new_edge(key_v, weight=0)
Crea un nuevo arco hacia el vertices con llave
key_v
con un pesoweight
Se crea un arco con los siguientes atributos:
- Parameters:
key_v (any) – Llave del vertice destino del arco
weight (double) – Peso del arco
- Returns:
Arco recien creado
- Return type:
- Example:
from DataStructures.Graph import edge as E # Crear un nuevo arco edge = E.new_edge("A", 5) print(edge) # Ssalida esperada: {'to': 'A', 'weight': 5}
- to(edge)
Retorna la llave de vertice destino del arco
edge
- Parameters:
edge (edge) – Arco del cual se quiere obtener el vertice destino
- Returns:
Llave del vertice destino del arco
- Return type:
any
- Example:
from DataStructures.Graph import edge as E # Crear un nuevo arco edge = E.new_edge("A", 5) print(E.to(edge)) # Salida esperada: A
- weight(edge)
Retorna el peso del arco
edge
- Parameters:
edge (edge) – Arco del cual se quiere obtener el peso
- Returns:
Peso del arco
- Return type:
double
- Example:
from DataStructures.Graph import edge as E # Crear un nuevo arco edge = E.new_edge("A", 5) print(E.weight(edge)) # Salida esperada: 5
- set_weight(edge, new_weight)
Actualiza el peso del arco
edge
por el valornew_weight
- Parameters:
edge (edge) – Arco al cual se le quiere cambiar el peso
weight (double) – Nuevo peso del arco
- Returns:
Arco con el nuevo peso
- Return type:
- Example:
from DataStructures.Graph import edge as E # Crear un nuevo arco edge = E.new_edge("A", 5) print(E.weight(edge)) # Ssalida esperada: 5 # Cambiar el peso del arco E.set_weight(edge, 10) print(E.weight(edge)) # Salida esperada: 10
Implementaciones
digraph.py
- new_graph(order)
Crea un grafo dirigido vacio.
Se crea un grafo con los siguientes atributos:
vertices
: Mapa con la lista de vertices del grafo. Implementada como un mapa map_linear_probing con un tamaño inicial deorder
.num_edges
: Numero de arcos del grafo. Inicializado en 0.
- Parameters:
order (int) – Numero de vertices inicial del grafo.
- Returns:
Grafo recien creado
- Return type:
Importante
Para asegurar obtener los mismos resultados en los mapas de los ejemplos, se debe modificar la función
new_map
como se indica en la sección Como hacer pruebas con tablas.- Example:
# App/logic.py from DataStructures.Graph import digraph as G # Crea un grafo vacio my_graph = G.new_graph(1) print(my_graph) # Salida esperada a continuacion:
Salida esperada:
{ 'vertices': { 'prime': 109345121, 'capacity': 3, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 3 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 }, 'num_edges': 0 }
- insert_vertex(my_graph, key_u, info_u)
Agrega un nuevo vertice al grafo
my_graph
.Se crea un nuevo vertice con la llave
key_u
y la informacioninfo_u
. Posteriomente, el vertice se agrega a la lista de vertices del grafo.- Parameters:
my_graph (digraph) – Grafo al que se le desea agregar el nuevo vertice
key_u (any) – Llave del nuevo vertice
info_u (any) – Informacion asociada al vertice
- Returns:
El grafo con el nuevo vertice
- Return type:
Importante
Para asegurar obtener los mismos resultados en los mapas de los ejemplos, se debe modificar la función
new_map
como se indica en la sección Como hacer pruebas con tablas.- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6print(my_graph) 7# Salida esperada a continuacion:
Salida esperada creacion de un grafo vacio:
{ 'vertices': { 'prime': 109345121, 'capacity': 3, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 3 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 }, 'num_edges': 0 }
8# Agrega un vertice al grafo 9my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "población": 300000}) 10print(my_graph) 11# Salida esperada a continuacion:
Salida esperada al agregar un vertice:
{ 'vertices': { 'prime': 109345121, 'capacity': 3, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': 'Armenia', 'value': { 'key': 'Armenia', 'value': { 'nombre': 'Armenia', 'población': 300000 }, 'adjacents': { 'prime': 109345121, 'capacity': 2, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 2 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 } } }, { 'key': None, 'value': None } ], 'size': 3 }, 'current_factor': 0.3333333333333333, 'limit_factor': 0.5, 'size': 1 }, 'num_edges': 0 }
- Test Scenarios:
Inserta un vertice en un grafo vacio: Se crea un grafo vacio y se inserta un vertice.
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6print(my_graph) 7# Salida esperada a continuacion:
Salida esperada creacion de un grafo vacio:
{ 'vertices': { 'prime': 109345121, 'capacity': 3, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 3 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 }, 'num_edges': 0 }
8# Agrega un vertice al grafo 9my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "población": 300000}) 10print(my_graph) 11# Salida esperada a continuacion:
Salida esperada al agregar un vertice:
{ 'vertices': { 'prime': 109345121, 'capacity': 3, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': 'Armenia', 'value': { 'key': 'Armenia', 'value': { 'nombre': 'Armenia', 'población': 300000 }, 'adjacents': { 'prime': 109345121, 'capacity': 2, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 2 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 } } }, { 'key': None, 'value': None } ], 'size': 3 }, 'current_factor': 0.3333333333333333, 'limit_factor': 0.5, 'size': 1 }, 'num_edges': 0 }
Inserta un vertice en un grafo con varios vertices: Se crea un grafo con varios vertices y se inserta otro vertice.
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "población": 300000}) 7my_graph = G.insert_vertex(my_graph, "Bogotá", {"nombre": "Bogotá", "población": 8000000}) 8print(my_graph) 9# Salida esperada a continuacion:
Salida esperada creacion de un grafo vacio:
{ 'vertices': { 'prime': 109345121, 'capacity': 7, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None }, { 'key': None, 'value': None }, { 'key': 'Armenia', 'value': { 'key': 'Armenia', 'value': { 'nombre': 'Armenia', 'población': 300000 }, 'adjacents': { 'prime': 109345121, 'capacity': 2, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 2 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 } } }, { 'key': None, 'value': None }, { 'key': 'Bogotá', 'value': { 'key': 'Bogotá', 'value': { 'nombre': 'Bogotá', 'población': 8000000 }, 'adjacents': { 'prime': 109345121, 'capacity': 2, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 2 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 } } }, { 'key': None, 'value': None } ], 'size': 7 }, 'current_factor': 0.2857142857142857, 'limit_factor': 0.5, 'size': 2 }, 'num_edges': 0 }
8# Agrega un vertice al grafo 9my_graph = G.insert_vertex(my_graph, "Cali", {"nombre": "Cali", "población": 2000000}) 10print(my_graph) 11# Salida esperada a continuacion:
Salida esperada al agregar un vertice:
{ 'vertices': { 'prime': 109345121, 'capacity': 7, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None }, { 'key': 'Cali', 'value': { 'key': 'Cali', 'value': { 'nombre': 'Cali', 'población': 2000000 }, 'adjacents': { 'prime': 109345121, 'capacity': 2, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 2 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 } } }, { 'key': None, 'value': None }, { 'key': 'Armenia', 'value': { 'key': 'Armenia', 'value': { 'nombre': 'Armenia', 'población': 300000 }, 'adjacents': { 'prime': 109345121, 'capacity': 2, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 2 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 } } }, { 'key': 'Bogotá', 'value': { 'key': 'Bogotá', 'value': { 'nombre': 'Bogotá', 'población': 8000000 }, 'adjacents': { 'prime': 109345121, 'capacity': 2, 'scale': 1, 'shift': 0, 'table': { 'elements': [ { 'key': None, 'value': None }, { 'key': None, 'value': None } ], 'size': 2 }, 'current_factor': 0, 'limit_factor': 0.5, 'size': 0 } } }, { 'key': None, 'value': None } ], 'size': 7 }, 'current_factor': 0.42857142857142855, 'limit_factor': 0.5, 'size': 3 }, 'num_edges': 0 }
- update_vertex_info(my_graph, key_u, new_info_u)
Actualiza la información del vertice con llave
key_u
con la nueva informaciónnew_info_u
.Se busca el vertice en el grafo y se actualiza su información. Si el vertice no existe, se retorna
None
. Si el vertice existe, se actualiza la información y se retorna el grafo actualizado.- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
key_u (any) – Llave del vertice que se desea actualizar
new_info_u (any) – La nueva informacion asociada al vertice
- Returns:
El grafo con la nueva informacion asociada al vertice
- Return type:
Importante
Para asegurar obtener los mismos resultados en los mapas de los ejemplos, se debe modificar la función
new_map
como se indica en la sección Como hacer pruebas con tablas.- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7my_graph = G.insert_vertex(my_graph, "Madrid", {"nombre": "Madrid", "pais": "España"}) 8print(my_graph)
{ "vertices": { "prime": 109345121, "capacity": 3, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": "Madrid", "value": { "key": "Madrid", "value": { "nombre": "Madrid", "pais": "España" }, "adjacents": { "prime": 109345121, "capacity": 2, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null } ], "size": 2 }, "current_factor": 0, "limit_factor": 0.5, "size": 0 } } }, { "key": null, "value": null } ], "size": 3 }, "current_factor": 0.3333333333333333, "limit_factor": 0.5, "size": 1 }, "num_edges": 0 }
9my_graph = G.update_vertex_info(my_graph, "Madrid", {"nombre": "Madrid", "pais": "Colombia"}) 10# Salida esperada:
{ "vertices": { "prime": 109345121, "capacity": 3, "scale": 1, "shift": 0, "table": { "elements": [ { "key": "Madrid", "value": { "key": "Madrid", "value": { "nombre": "Madrid", "pais": "Colombia" }, "adjacents": { "prime": 109345121, "capacity": 2, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null } ], "size": 2 }, "current_factor": 0, "limit_factor": 0.5, "size": 0 } } }, { "key": null, "value": null }, { "key": null, "value": null } ], "size": 3 }, "current_factor": 0.3333333333333333, "limit_factor": 0.5, "size": 1 }, "num_edges": 0 }
- Test Scenario:
Vertice existente: Actualiza la información de un vértice existente en el grafo.
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7my_graph = G.insert_vertex(my_graph, "Madrid", {"nombre": "Madrid", "pais": "España"}) 8print(my_graph) 9# Salida esperada:
Salida esperada
{ "vertices": { "prime": 109345121, "capacity": 3, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": "Madrid", "value": { "key": "Madrid", "value": { "nombre": "Madrid", "pais": "España" }, "adjacents": { "prime": 109345121, "capacity": 2, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null } ], "size": 2 }, "current_factor": 0, "limit_factor": 0.5, "size": 0 } } }, { "key": null, "value": null } ], "size": 3 }, "current_factor": 0.3333333333333333, "limit_factor": 0.5, "size": 1 }, "num_edges": 0 }
9my_graph = G.update_vertex_info(my_graph, "Madrid", {"nombre": "Madrid", "pais": "Colombia"}) 10# Salida esperada:
Salida esperada creacion de un grafo vacio:
{ "vertices": { "prime": 109345121, "capacity": 3, "scale": 1, "shift": 0, "table": { "elements": [ { "key": "Madrid", "value": { "key": "Madrid", "value": { "nombre": "Madrid", "pais": "Colombia" }, "adjacents": { "prime": 109345121, "capacity": 2, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null } ], "size": 2 }, "current_factor": 0, "limit_factor": 0.5, "size": 0 } } }, { "key": null, "value": null }, { "key": null, "value": null } ], "size": 3 }, "current_factor": 0.3333333333333333, "limit_factor": 0.5, "size": 1 }, "num_edges": 0 }
Vertice no existente en el grafo: Intenta actualizar la información de un vértice que no existe en el grafo y verifica que no se produce ningún cambio.
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7# Actualiza la información de un vértice que no existe 8my_graph = G.update_vertex_info(my_graph, "Madrid", {"nombre": "Madrid", "pais": "Colombia"}) 9 10print(my_graph) 11# Salida esperada: None
- remove_vertex(my_graph, key_u)
Remueve el vertice con llave
key_u
del grafomy_graph
.Se busca el vertice en el grafo y se elimina de la lista de vertices. Si el vertice no existe, se retorna
None
. Si el vertice existe, se elimina y se retorna el grafo actualizado. Es importante tener en cuenta que al eliminar un vertice, se deben eliminar todos los arcos asociados a ese vertice.
- add_edge(my_graph, key_u, key_v, weight=1.0)
Agrega un arco al grafo
my_graph
entre los vertices con llaveskey_u
ykey_v
con pesoweight
.Se busca el vertice
key_u
en el grafo y se verifica si existe. Si no existe, se lanza una excepcion. Se busca el verticekey_v
en el grafo y se verifica si existe. Si no existe, se lanza una excepcion. Si ambos vertices existen, se agrega el arco entre ellos. Si el arco ya existe, se reemplaza el peso del arco (NO se aceptan arcos paralelos).- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
key_u (any) – Vertice de inicio
key_v (any) – Vertice destino
weight (double) – Peso del arco, por defecto 1
- Returns:
El grafo con el nuevo arco
- Return type:
Importante
Para lanzar error si no se encuentran los vertices, use el siguiente código como referencia:
raise Exception("El vertice u no existe")
Importante
Para asegurar obtener los mismos resultados en los mapas de los ejemplos, se debe modificar la función
new_map
como se indica en la sección Como hacer pruebas con tablas.- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7# Inserta vertices 8my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "poblacion": 300000}) 9my_graph = G.insert_vertex(my_graph, "Bogota", {"nombre": "Bogota", "poblacion": 8000000}) 10 11# Inserta un arco 12my_graph = G.add_edge(my_graph, "Armenia", "Bogota", 100) 13 14print(my_graph) 15# Salida esperada:
{ "vertices": { "prime": 109345121, "capacity": 7, "scale": 1, "shift": 0, "table": { "elements": [ { "key": "Bogota", "value": { "key": "Bogota", "value": { "nombre": "Bogota", "poblacion": 8000000 }, "adjacents": { "prime": 109345121, "capacity": 2, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null } ], "size": 2 }, "current_factor": 0, "limit_factor": 0.5, "size": 0 } } }, { "key": null, "value": null }, { "key": null, "value": null }, { "key": null, "value": null }, { "key": null, "value": null }, { "key": "Armenia", "value": { "key": "Armenia", "value": { "nombre": "Armenia", "poblacion": 300000 }, "adjacents": { "prime": 109345121, "capacity": 5, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null }, { "key": null, "value": null }, { "key": null, "value": null }, { "key": "Bogota", "value": { "to": "Bogota", "weight": 100 } } ], "size": 5 }, "current_factor": 0.2, "limit_factor": 0.5, "size": 1 } } }, { "key": null, "value": null } ], "size": 7 }, "current_factor": 0.2857142857142857, "limit_factor": 0.5, "size": 2 }, "num_edges": 1 }
- Test Scenario:
Grafo sin vertices: Lanza error si no se encuentran los vertices.
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7# Inserta vertices 8my_graph = G.insert_vertex(my_graph, "Armenia", { 9 "nombre": "Armenia", "poblacion": 300000}) 10my_graph = G.insert_vertex( 11 my_graph, "Bogota", {"nombre": "Bogota", "poblacion": 8000000}) 12 13# Inserta un arco 14my_graph = G.add_edge(my_graph, "A", "B", 100, ) 15# Salida esperada en consola: 16# raise Exception("El vertice u no existe") 17# Exception: El vertice u no existe
Grafo con vertices: Se crea un grafo con vertices y se le agregan arcos.
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7# Inserta vertices 8my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "poblacion": 300000}) 9my_graph = G.insert_vertex(my_graph, "Bogota", {"nombre": "Bogota", "poblacion": 8000000}) 10my_graph = G.insert_vertex(my_graph, "Cali", {"nombre": "Cali", "poblacion": 2000000}) 11 12# Inserta un arco 13my_graph = G.add_edge(my_graph, "Armenia", "Bogota", 100) 14my_graph = G.add_edge(my_graph, "Armenia", "Cali", 200) 15my_graph = G.add_edge(my_graph, "Bogota", "Cali", 300) 16 17print(my_graph) 18# Salida esperada:
Respuesta inserción del arco
{ "vertices": { "prime": 109345121, "capacity": 7, "scale": 1, "shift": 0, "table": { "elements": [ { "key": "Cali", "value": { "key": "Cali", "value": { "nombre": "Cali", "poblacion": 2000000 }, "adjacents": { "prime": 109345121, "capacity": 2, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null } ], "size": 2 }, "current_factor": 0, "limit_factor": 0.5, "size": 0 } } }, { "key": null, "value": null }, { "key": "Armenia", "value": { "key": "Armenia", "value": { "nombre": "Armenia", "poblacion": 300000 }, "adjacents": { "prime": 109345121, "capacity": 5, "scale": 1, "shift": 0, "table": { "elements": [ { "key": "Bogota", "value": { "to": "Bogota", "weight": 100 } }, { "key": null, "value": null }, { "key": "Cali", "value": { "to": "Cali", "weight": 200 } }, { "key": null, "value": null }, { "key": null, "value": null } ], "size": 5 }, "current_factor": 0.4, "limit_factor": 0.5, "size": 2 } } }, { "key": "Bogota", "value": { "key": "Bogota", "value": { "nombre": "Bogota", "poblacion": 8000000 }, "adjacents": { "prime": 109345121, "capacity": 5, "scale": 1, "shift": 0, "table": { "elements": [ { "key": null, "value": null }, { "key": null, "value": null }, { "key": "Cali", "value": { "to": "Cali", "weight": 300 } }, { "key": null, "value": null }, { "key": null, "value": null } ], "size": 5 }, "current_factor": 0.2, "limit_factor": 0.5, "size": 1 } } }, { "key": null, "value": null }, { "key": null, "value": null }, { "key": null, "value": null } ], "size": 7 }, "current_factor": 0.42857142857142855, "limit_factor": 0.5, "size": 3 }, "num_edges": 3 }
- order(my_graph)
Retorna el orden del grafo, es decir, el numero de vertices del grafo
my_graph
.- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
- Returns:
El numero de vertices del grafo
- Return type:
int
Importante
Para asegurar obtener los mismos resultados en los mapas de los ejemplos, se debe modificar la función
new_map
como se indica en la sección Como hacer pruebas con tablas.- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7print(G.order(my_graph)) 8# Salida esperada: 0
- Test Scenario:
Grafo vacio: Se crea un grafo vacio y se imprime su contenido
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7print(G.order(my_graph)) 8# Salida esperada: 0
Grafo con vertices: Se crea un grafo con vertices y se imprime su contenido
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "población": 300000}) 7my_graph = G.insert_vertex(my_graph, "Bogotá", {"nombre": "Bogotá", "población": 8000000}) 8 9print(G.order(my_graph)) 10# Salida esperada: 2
- size(my_graph)
Retorna el tamaño del grafo, es decir, el numero de arcos del grafo
my_graph
.- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
- Returns:
El numero de arcos del grafo
- Return type:
int
Importante
Para asegurar obtener los mismos resultados en los mapas de los ejemplos, se debe modificar la función
new_map
como se indica en la sección Como hacer pruebas con tablas.- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7print(G.size(my_graph)) 8# Salida esperada: 0
- Test Scenario:
Grafo vacio: Se crea un grafo vacio y se imprime su contenido
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7print(G.size(my_graph)) 8# Salida esperada: 0
Grafo con varios: Se crea un grafo con varios vertices y arcos.
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "población": 300000}) 7my_graph = G.insert_vertex(my_graph, "Bogotá", {"nombre": "Bogotá", "población": 8000000}) 8my_graph = G.insert_vertex(my_graph, "Cali", {"nombre": "Cali", "población": 2000000}) 9 10my_graph = G.add_edge(my_graph, "Armenia", "Bogotá", 100 ) 11my_graph = G.add_edge(my_graph, "Armenia", "Cali", 200) 12my_graph = G.add_edge(my_graph, "Bogotá", "Cali", 300) 13 14print(G.size(my_graph)) 15# Salida esperada: 3
- vertices(my_graph)
Retorna una lista con las llaves de todos los vertices del grafo
my_graph
.- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
- Returns:
La lista con los vertices del grafo
- Return type:
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7# Inserta vertices 8my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "poblacion": 300000}) 9my_graph = G.insert_vertex(my_graph, "Bogota", {"nombre": "Bogota", "poblacion": 8000000}) 10my_graph = G.insert_vertex(my_graph, "Cali", {"nombre": "Cali", "poblacion": 2000000}) 11 12print(G.vertices(my_graph)) 13# Salida esperada:
{ "elements": [ "Cali", "Armenia", "Bogota" ], "size": 3 }
- Test Scenarios:
Grafo sin vertices: Se crea un grafo vacio y se imprime su contenido
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7print(G.vertices(my_graph)) 8# Salida esperada:
{ "elements": [], "size": 0 }
Grafo con vertices: Se crea un grafo con vertices y se imprime su contenido
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "poblacion": 300000}) 7my_graph = G.insert_vertex(my_graph, "Bogota", {"nombre": "Bogota", "poblacion": 8000000}) 8my_graph = G.insert_vertex(my_graph, "Cali", {"nombre": "Cali", "poblacion": 2000000}) 9 10print(G.vertices(my_graph)) 11# Salida esperada:
{ "elements": [ "Cali", "Armenia", "Bogota" ], "size": 3 }
- degree(my_graph, key_u)
Retorna el grado del vertice con llave
key_u
, es decir, el numero de arcos adyacentes al vertice.Si el vertice no existe, se lanza una excepcion.
- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
key_u (any) – El vertice del que se desea conocer el grado
- Returns:
El grado del vertice. Lanza una excepcion en caso de que el vertice no exista.
- Return type:
int
Importante
Para lanzar error si no se encuentran los vertices, use el siguiente código como referencia:
raise Exception("El vertice no existe")
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7# Inserta vertices 8my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "poblacion": 300000}) 9my_graph = G.insert_vertex(my_graph, "Bogota", {"nombre": "Bogota", "poblacion": 8000000}) 10my_graph = G.insert_vertex(my_graph, "Cali", {"nombre": "Cali", "poblacion": 2000000}) 11 12# Inserta un arco 13my_graph = G.add_edge(my_graph, "Armenia", "Bogota", 100) 14my_graph = G.add_edge(my_graph, "Armenia", "Cali", 200) 15 16print(G.degree(my_graph, "Armenia")) 17# Salida: 2
- get_edge(my_graph, key_u, key_v)
Retorna el arco asociado a los vertices con llave
key_u
akey_v
.Si el vertice
key_u
no existe, se lanza una excepcion. Si el arco no existe, se retornaNone
.Importante
Para lanzar error si no se encuentran los vertices, use el siguiente código como referencia:
raise Exception("El vertice u no existe")
- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
key_u (any) – Vertice de inicio
key_v (any) – Vertice destino
- Returns:
El arco que une los verices key_u a key_v
- Return type:
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacio 5my_graph = G.new_graph(1) 6 7# Inserta vertices 8my_graph = G.insert_vertex(my_graph, "Armenia", {"nombre": "Armenia", "poblacion": 300000}) 9my_graph = G.insert_vertex(my_graph, "Bogota", {"nombre": "Bogota", "poblacion": 8000000}) 10my_graph = G.insert_vertex(my_graph, "Cali", {"nombre": "Cali", "poblacion": 2000000}) 11 12# Inserta un arco 13my_graph = G.add_edge(my_graph, "Armenia", "Bogota", 100) 14my_graph = G.add_edge(my_graph, "Armenia", "Cali", 200) 15 16print(G.degree(my_graph, "Armenia")) 17# Salida: 2
- get_vertex_information(my_graph, key_u)
Retorna la informacion asociada al vertice con llave
key_u
Si el vertice no existe, se lanza una excepcion.
Importante
Para lanzar error si no se encuentran los vertices, use el siguiente código como referencia:
raise Exception("El vertice no existe")
- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
key_u (any) – Vertice del que se quiere la informacion
- Returns:
La informacion asociada al vertice.
- Return type:
any
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacío 5my_graph = G.new_graph(1) 6 7# Inserta vértices con información 8my_graph = G.insert_vertex(my_graph, "Medellin", {"nombre": "Medellin", "poblacion": 2500000}) 9my_graph = G.insert_vertex(my_graph, "Cartagena", {"nombre": "Cartagena", "poblacion": 1000000}) 10 11# Obtiene la información de un vértice existente 12info = G.get_vertex_information(my_graph, "Medellin") 13print(info) 14# Salida esperada: {'nombre': 'Medellin', 'poblacion': 2500000} 15 16# Intenta obtener la información de un vértice que no existe 17try: 18 info = G.get_vertex_information(my_graph, "Barranquilla") 19except Exception as e: 20 print(e) 21# Salida esperada: El vertice no existe
- contains_vertex(my_graph, key_u)
Retorna si el vertice con llave``key_u`` esta presente en el grafo.
- Parameters:
my_graph (digraph) – El grafo sobre el cual consultar la existencia del vertice
key_u (any) – Vertice a buscar
- Returns:
True
si el vertice esta presente,False
en caso contrario- Return type:
bool
- Example:
1# App/logic.py 2 3from DataStructures.Graph import digraph as G 4 5# Crea un grafo vacío 6my_graph = G.new_graph(1) 7 8# Inserta algunos vértices 9my_graph = G.insert_vertex(my_graph, "Santa Marta", {"nombre": "Santa Marta", "poblacion": 500000}) 10my_graph = G.insert_vertex(my_graph, "Manizales", {"nombre": "Manizales", "poblacion": 400000}) 11 12# Verifica si existen ciertos vértices 13print(G.contains_vertex(my_graph, "Santa Marta")) # Salida esperada: True 14print(G.contains_vertex(my_graph, "Cucuta")) # Salida esperada: False
- adjacents(my_graph, key_u)
Retorna una lista con las llaves de los vertices adyacentes al vertice vertex con llave
key_u
.Si el vertice no existe, se lanza una excepcion. Si el vertice existe, se retorna una lista con las llaves de los vertices adyacentes. Si no tiene vertices adyacentes, se retorna una lista vacia.
Importante
Para lanzar error si no se encuentran los vertices, use el siguiente código como referencia:
raise Exception("El vertice no existe")
- Parameters:
my_grph (digraph) – El grafo sobre el que se ejecuta la operacion
key_vertex (any) – El vertice del que se quiere la lista
- Returns:
La lista de vertices adyacencias. Retorna una lista vacia en caso de que el vertice no exista.
- Return type:
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacío 5my_graph = G.new_graph(1) 6 7# Inserta vértices 8my_graph = G.insert_vertex(my_graph, "Tunja", {"nombre": "Tunja", "poblacion": 200000}) 9my_graph = G.insert_vertex(my_graph, "Villavicencio", {"nombre": "Villavicencio", "poblacion": 300000}) 10my_graph = G.insert_vertex(my_graph, "Neiva", {"nombre": "Neiva", "poblacion": 350000}) 11 12# Inserta arcos 13my_graph = G.add_edge(my_graph, "Tunja", "Villavicencio", 150) 14my_graph = G.add_edge(my_graph, "Tunja", "Neiva", 180) 15 16# Consulta de adyacencias 17adj = G.adjacents(my_graph, "Tunja") 18print(adj) 19# Salida esperada: ['Villavicencio', 'Neiva'] 20 21# Consulta de adyacencias para un vértice sin conexiones 22adj = G.adjacents(my_graph, "Neiva") 23print(adj) 24# Salida esperada: [] 25 26# Consulta de adyacencias para un vértice inexistente 27try: 28 adj = G.adjacents(my_graph, "Popayan") 29except Exception as e: 30 print(e) 31# Salida esperada: El vertice no existe
- edges_vertex(my_graph, key_u)
Retorna una lista con todos los arcos asociados a los vértice adyacentes del vertice con llave
key_u
.Si el vertice no existe, se lanza una excepcion. Si el vertice existe, se retorna una lista con los arcos asociados a los vertices adyacentes. Si no tiene arcos adyacentes, se retorna una lista vacia.
Importante
Para lanzar error si no se encuentran los vertices, use el siguiente código como referencia:
raise Exception("El vertice no existe")
- Parameters:
my_graph (digraph) – El grafo sobre el que se ejecuta la operacion
vertex (any) – El vertice del que se quiere la lista
- Returns:
La lista de arcos adyacentes. Retorna una lista vacia en caso de que el vertice no exista.
- Return type:
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacío 5my_graph = G.new_graph(1) 6 7# Inserta vértices 8my_graph = G.insert_vertex(my_graph, "Pasto", {"nombre": "Pasto", "poblacion": 400000}) 9my_graph = G.insert_vertex(my_graph, "Ibague", {"nombre": "Ibague", "poblacion": 500000}) 10my_graph = G.insert_vertex(my_graph, "Monteria", {"nombre": "Monteria", "poblacion": 300000}) 11 12# Inserta arcos 13my_graph = G.add_edge(my_graph, "Pasto", "Ibague", 120) 14my_graph = G.add_edge(my_graph, "Pasto", "Monteria", 250) 15 16# Consulta de arcos salientes del vértice 'Pasto' 17edges = G.edges_vertex(my_graph, "Pasto") 18for edge in edges: 19 print(edge) 20# Salida esperada (dependiendo de la representación interna, algo como): 21# ('Pasto', 'Ibague', 120) 22# ('Pasto', 'Monteria', 250) 23 24# Consulta de arcos salientes para un vértice sin conexiones 25edges = G.edges_vertex(my_graph, "Ibague") 26print(edges) 27# Salida esperada: [] 28 29# Consulta de arcos salientes para un vértice inexistente 30try: 31 edges = G.edges_vertex(my_graph, "Leticia") 32except Exception as e: 33 print(e) 34# Salida esperada: El vertice no existe
- get_vertex(my_graph, key_u)
Retorna el valor del vertice con llave
key_u
.Si el vertice no existe, se lanza una excepcion.
Importante
Para lanzar error si no se encuentran los vertices, use el siguiente código como referencia:
raise Exception("El vertice no existe")
- Parameters:
my_graph (adj_list_graph) – El grafo sobre el que se ejecuta la operacion
key_u (any) – Vertice del que se quiere la informacion
- Returns:
El vertice. Retorna
None
en caso de que el vertice no exista.- Return type:
vertex
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3 4# Crea un grafo vacío 5my_graph = G.new_graph(1) 6 7# Inserta algunos vértices 8my_graph = G.insert_vertex(my_graph, "Sincelejo", {"nombre": "Sincelejo", "poblacion": 280000}) 9my_graph = G.insert_vertex(my_graph, "Quibdo", {"nombre": "Quibdo", "poblacion": 130000}) 10 11# Obtener el vértice existente 12vertex = G.get_vertex(my_graph, "Sincelejo") 13print(vertex) 14# Salida esperada (dependiendo de implementación): el objeto vértice o su representación 15# Por ejemplo: ('Sincelejo', {'nombre': 'Sincelejo', 'poblacion': 280000}) 16 17# Intentar obtener un vértice inexistente 18try: 19 vertex = G.get_vertex(my_graph, "Mocoa") 20except Exception as e: 21 print(e) 22# Salida esperada: El vertice no existe
Algoritmos en grafos
dfs.py
- dfs(my_graph, source)
Inicia un recorrido Depth First Search (DFS) sobre el grafo
my_graph
a partir de un vertice inicial con llavesource
.- Parameters:
my_graph (digraph) – El grafo a recorrer
source (any) – Llave del vertice de inicio del recorrido.
- Returns:
Una estructura para determinar los vertices conectados a source
- Return type:
- dfs_vertex(my_graph, vertex, visited_map)
Funcion auxiliar para calcular un recorrido DFS usada por la funcion depth_first_search.
- Parameters:
search (graph_search) – Estructura para almacenar el recorrido
my_graph (adj_list_graph) – El grafo a recorrer
vertex (any) – Vertice de inicio del recorrido.
- Returns:
Una estructura para determinar los vertices conectados a source
- Return type:
graph_search
- Example:
1# App/logic.py 2from DataStructures.Graph import digraph as G 3from App.Algorithms import dfs as DFS 4 5# Crear un grafo vacío 6my_graph = G.new_graph(1) 7 8# Insertar vértices 9my_graph = G.insert_vertex(my_graph, "Bogota", {}) 10my_graph = G.insert_vertex(my_graph, "Medellin", {}) 11my_graph = G.insert_vertex(my_graph, "Cali", {}) 12my_graph = G.insert_vertex(my_graph, "Barranquilla", {}) 13 14# Agregar arcos (dirigidos) 15my_graph = G.add_edge(my_graph, "Bogota", "Medellin", 1) 16my_graph = G.add_edge(my_graph, "Medellin", "Cali", 1) 17my_graph = G.add_edge(my_graph, "Cali", "Barranquilla", 1) 18 19# Ejecutar DFS desde "Bogota" 20dfs_result = DFS.dfs(my_graph, "Bogota") 21 22# Mostrar los resultados del recorrido 23print("Preorden:", dfs_result["pre"]["elements"]) 24print("Postorden:", dfs_result["post"]["elements"]) 25print("Reverse postorden (pila):", dfs_result["reversepost"]["elements"])
- has_path_to(key_v, visited_map)
Indica si existe un camino entre el vertice source y el vertice vertex a partir de una estructura
search
.Precondición
Se debe haber ejecutado previamente la funcion depth_first_search.
- Parameters:
search (graph_search) – Estructura de recorrido DFS
vertex (any) – Vertice destino
- Returns:
True
si existe un camino entre source y vertex,False
en caso contrario- Return type:
bool
- path_to(key_v, visited_map)
Retorna el camino entre el vertices
source
y el verticevertex
a partir de una estructurasearch
.Precondición
Se debe haber ejecutado previamente la funcion depth_first_search.
- Parameters:
search (graph_search) – La estructura con el recorrido
vertex (any) – Vertice de destingo
- Returns:
Una pila con el camino entre el vertices source y el vertice vertex
- Return type:
stack
bfs.py
- bfs(my_graph, source)
Inicia un recorrido Breath First Seacrh (BFS) sobre el grafo a partir de un vertice inicial. Crea una estructura de busqueda
graph_search
y posteriormente llama a la funcionbfs_vertex
.- Parameters:
my_graph (adj_list_graph) – El grafo a recorrer
source (any) – Llave del vertice de inicio del recorrido.
- Returns:
Una estructura para determinar los vertices conectados a source
- Return type:
graph_search
- bfs_vertex(my_graph, source, visited_map)
Función auxiliar para calcular un recorrido BFS usada por la función breath_first_search.
- Parameters:
visited_map (graph_search) – Estructura para almacenar el recorrido
my_graph (adj_list_graph) – El grafo a recorrer
source (any) – Vertice de inicio del recorrido.
- Returns:
Una estructura para determinar los vertices conectados a source
- Return type:
graph_visited_map
- has_path_to(key_v, visited_map)
Indica si existe un camino entre el vertice source y el vertice vertex a partir de una estructura
search
.Precondición
Se debe haber ejecutado previamente la funcion breath_first_search.
- Parameters:
search (graph_search) – Estructura de recorrido BFS
vertex (any) – Vertice destino
- Returns:
True
si existe un camino entre source y vertex,False
en caso contrario
- path_to(key_v, visited_map)
Retorna el camino entre el vertices
source
y el verticevertex
a partir de una estructura de busquedasearch
.Precondición
Se debe haber ejecutado previamente la funcion breath_first_search.
- Parameters:
search (graph_search) – Estructura de recorrido BFS
vertex (any) – Vertice destino
- Returns:
Una pila con el camino entre source y vertex. Si no existe camino retorna
None
.- Return type:
stack
dfo.py
- dfo(my_graph)
Inicia un recorrido Depth First Order (DFO) sobre el grafo. Crea una estructura de busqueda
dfo_search
y posteriormente llama a la funciondfs_vertex
.- Parameters:
my_graph (adj_list_graph) – El grafo a recorrer
- Returns:
Una estructura de busqueda para determinar el orden de los vertices
- Return type:
dfo_search
- dfs_vertex(my_graph, key_v, aux_structure)
Función auxiliar para calcular un recorrido DFO usada por la función depth_first_order.
- Parameters:
my_graph (adj_list_graph) – El grafo a recorrer
search (dfo_search) – Estructura para almacenar el recorrido
vertex (any) – Vertice de inicio del recorrido.
- Returns:
Una estructura para determinar los vertices conectados a source
- Return type:
dfo_search
prim.py
- prim_mst(my_graph, source)
Implementa el algoritmo de Prim para encontrar el arbol de expansion minima de un grafo no dirigido y conexo. El algoritmo inicia en el vertice source y va agregando arcos de menor peso que conecten vertices que no esten en el arbol de expansion minima. El algoritmo termina cuando todos los vertices estan en el arbol de expansion minima. El algoritmo es similar al algoritmo de Dijkstra, pero en lugar de agregar vertices al arbol de expansion minima, se agregan arcos.
- Parameters:
my_graph (adj_list_graph) – El grafo a examinar
source (any) – El vertice fuente
- Returns:
La estructura search con los MST
- Return type:
prim_search
- edges_mst(my_graph, aux_structure)
Retorna los arcos del arbol de expansion minima (MST) en una cola en el orden
Precondición
Se debe haber ejecutado previamente la funcion prim_mst.
- Parameters:
my_graph (adj_list_graph) – El grafo a examinar
search (prim_search) – La estructura de busqueda
- Returns:
La cola con los arcos del MST
- Return type:
queue
- weight_mst(my_graph, aux_structure)
Retorna el peso total del arbol de expansion minima (MST).
Precondición
Se debe haber ejecutado previamente la funcion prim_mst.
- Parameters:
my_graph (adj_list_graph) – El grafo a examinar
search (prim_search) – La estructura de busqueda
- Returns:
El peso total del arbol de expansion minima
- Return type:
float
dijsktra.py
- dijkstra(my_graph, source)
Implementa el algoritmo de Dijkstra Args:
my_graph: El grafo de busqueda source: El vertice de inicio
- Returns:
Un nuevo grafo vacío
- Raises:
Exception
- dist_to(key_v, aux_structure)
Retorna el costo para llegar del vertice source al vertice vertex. Args:
search: La estructura de busqueda vertex: El vertice destino
- Returns:
El costo total para llegar de source a vertex. Infinito si no existe camino
- Raises:
Exception
- has_path_to(key_v, aux_structure)
Indica si hay camino entre source y vertex Args:
search: La estructura de busqueda vertex: El vertice de destino
- Returns:
True si existe camino
- Raises:
Exception
- path_to(key_v, aux_structure)
Retorna el camino entre source y vertex en una pila. Args:
search: La estructura de busqueda vertex: El vertice de destino
- Returns:
Una pila con el camino entre source y vertex
- Raises:
Exception
Estructuras de recorrido
dfo_structure.py
- new_dfo_structure(g_order)
Crea una estructura de busqueda usada en el algoritmo depth_first_order.
Se crea una estructura de busqueda con los siguientes atributos:
marked: Mapa con los vertices visitados. Se inicializa en
None
pre: Cola con los vertices visitados en preorden. Se inicializa como una cola vacia.
post: Cola con los vertices visitados en postorden. Se inicializa como una cola vacia.
reversepost: Pila con los vertices visitados en postorden inverso. Se inicializa como una pila vacia.
- Returns:
Estructura de busqueda
- Return type:
dfo_search
prim_structure.py
- new_prim_structure(source, g_order)
Crea una estructura de busqueda usada en el algoritmo prim.
Se crea una estructura de busqueda con los siguientes atributos:
source: Vertice de inicio del MST.
edge_from: Mapa con los vertices visitados. Se inicializa en
None
dist_to: Mapa con las distancias a los vertices. Se inicializa en
None
marked: Mapa con los vertices visitados. Se inicializa en
None
pq: Cola de prioridad indexada (index_priority_queue). Se inicializa en
None
- Returns:
Estructura de busqueda
- Return type:
prim_search
dijsktra_structure.py
- new_dijsktra_structure(source, g_order)
Crea una estructura de busqueda usada en el algoritmo dijsktra.
Se crea una estructura de busqueda con los siguientes atributos:
source: Vertice de origen. Se inicializa en
source
visited: Mapa con los vertices visitados. Se inicializa en
None
pq: Cola indexada con los vertices visitados. Se inicializa en
None
- Returns:
Estructura de busqueda
- Return type:
dijsktra_search