Featured image of post Búsqueda en estructuras de datos de árboles y grafos (DFS, BFS, algoritmo de Dijkstra)

Búsqueda en estructuras de datos de árboles y grafos (DFS, BFS, algoritmo de Dijkstra)

Estructuras de datos de árboles y grafos para representar relaciones de datos complejas. Una explicación exhaustiva desde la búsqueda en profundidad (DFS) y en anchura (BFS) hasta el problema del camino más corto (algoritmo de Dijkstra).

Acerca de la búsqueda en estructuras de datos de árboles y grafos

Introducción

En este artículo, explicaremos en detalle desde los conceptos básicos hasta los algoritmos de búsqueda para la estructura de árbol (Tree) y la estructura de grafo (Graph), que son estructuras de datos que juegan un papel muy importante en la ciencia de la computación.

En el campo de las estructuras de datos y algoritmos, estos son temas inevitables. Especialmente la búsqueda en profundidad (DFS), la búsqueda en anchura (BFS) y el algoritmo de Dijkstra (Dijkstra’s Algorithm) para resolver el problema del camino más corto aparecen con frecuencia tanto en concursos de programación como en la práctica.

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

1. Conceptos básicos de la estructura de árbol (Tree)

La estructura de árbol es una estructura de datos adecuada para representar datos con relaciones jerárquicas. Se utiliza en diversas situaciones, como sistemas de archivos, organigramas, árboles DOM de HTML, etc.

Una estructura de árbol consta de los siguientes elementos:

  • Nodo (Node): Elemento que contiene los datos
  • Arista (Edge): Línea que conecta los nodos
  • Nodo raíz (Root Node): El nodo en la parte superior del árbol. Es un nodo sin padre.
  • Nodo hoja (Leaf Node): Es un nodo sin hijos.
  graph TD
  "Root" --> "NodeA"
  "Root" --> "NodeB"
  "NodeA" --> "Leaf1"
  "NodeA" --> "Leaf2"
  "NodeB" --> "Leaf3"

Como conceptos básicos de búsqueda en la estructura de árbol, existen la búsqueda en profundidad (DFS) y la búsqueda en anchura (BFS).

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

2. Búsqueda en profundidad (DFS: Depth-First Search)

La búsqueda en profundidad es un algoritmo que parte de un cierto nodo, avanza lo más profundo posible, y al llegar a un callejón sin salida, regresa al nodo anterior para continuar la búsqueda. Se puede implementar de manera muy simple utilizando funciones recursivas. También se suele utilizar una estructura de datos llamada pila (Stack).

Ejemplo de implementación en Python de DFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

def dfs_tree(node):
    if node is None:
        return
    print(f"Visitando {node.value}")
    for child in node.children:
        dfs_tree(child)

# Construcción del árbol
root = TreeNode("Root")
node_a = TreeNode("A")
node_b = TreeNode("B")
root.children.extend([node_a, node_b])
node_a.children.extend([TreeNode("C"), TreeNode("D")])

print("Recorrido DFS:")
dfs_tree(root)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

3. Búsqueda en anchura (BFS: Breadth-First Search)

La búsqueda en anchura es un algoritmo que parte del nodo raíz, explora todos los nodos en la misma profundidad y luego avanza a los nodos de la siguiente profundidad. Utiliza una estructura de datos llamada cola (Queue). A menudo se utiliza para encontrar el camino más corto, entre otras cosas.

Ejemplo de implementación en Python de BFS en una estructura de árbol

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from collections import deque

def bfs_tree(root):
    if root is None:
        return
    queue = deque([root])
    while queue:
        current = queue.popleft()
        print(f"Visitando {current.value}")
        for child in current.children:
            queue.append(child)

print("Recorrido BFS:")
bfs_tree(root)

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

4. Conceptos básicos de la estructura de grafo (Graph)

La estructura de grafo se compone de un conjunto de nodos (vértices: Vertex) y aristas (bordes: Edge). La estructura de árbol también es un tipo de grafo (un grafo no dirigido o grafo dirigido sin ciclos), pero un grafo general puede tener ciclos (Cycle) y es posible que tenga múltiples padres.

Existen los siguientes tipos de grafos:

  • Grafo no dirigido (Undirected Graph): Grafo en el que las aristas no tienen dirección
  • Grafo dirigido (Directed Graph): Grafo en el que las aristas tienen dirección
  • Grafo ponderado (Weighted Graph): Grafo en el que se asigna un peso (costo) a las aristas
  graph LR
  "A" -- "5" --> "B"
  "A" -- "2" --> "C"
  "B" -- "1" --> "D"
  "C" -- "8" --> "D"
  "C" -- "4" --> "E"
  "D" -- "3" --> "E"

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

5. Algoritmo de Dijkstra (Dijkstra’s Algorithm)

El algoritmo de Dijkstra es un algoritmo que encuentra el camino más corto desde un punto de inicio a todos los demás vértices en un grafo ponderado. Sin embargo, los pesos de las aristas deben ser no negativos (0 o más).

Usando una cola de prioridad (Priority Queue), la búsqueda se puede realizar de manera eficiente. Como expresión matemática, si $ d(v) $ es la distancia más corta desde el punto de inicio hasta el vértice $ v $, se actualiza como $ d(v) = \min(d(v), d(u) + w(u, v)) $ para el peso $ w(u, v) $ de la arista $ (u, v) $. Como fórmula, satisface la propiedad $ d(v) \le d(u) + w(u, v) $. Aquí, elegimos la ruta donde $ \text{costo} $ es mínimo.

Ejemplo de implementación en Python del algoritmo de Dijkstra

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import heapq

def dijkstra(graph, start):
    # Inicializar la distancia más corta al infinito
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# Definición del grafo (formato de lista de adyacencia)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'D': 1},
    'C': {'D': 8, 'E': 4},
    'D': {'E': 3},
    'E': {}
}

start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
print(f"Caminos más cortos desde {start_node}: {shortest_paths}")

Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.Añadimos más descripción a continuación sobre explicaciones detalladas del algoritmo y notas complementarias. Estas son extremadamente importantes.

comments powered by Disqus