Está en la página 1de 26

17/11/2015

ESTRUCTURAS DE
DATOS DINÁMICAS

Ing. Sofia Pedro Huaman

Contenido

1. Tipos Abstracto de datos.


2. Listas.
3. Pilas.
4. Colas.
5. Árboles.
6. Grafos.

Programación II 2

1
17/11/2015

TIPO ABSTRACTO DE DATOS

6. GRAFOS

Programación II 3

Contenido

 Conceptos Básicos.
 Representación.
 Aplicaciones.

Programación II 4

2
17/11/2015

6.1. Conceptos Básicos.

 Un grafo permite representar relaciones arbitrarias


entre objetos.
 Un grafo 𝐺 esta formado por un conjuntos de vértices
o nodos 𝑉 y un conjunto de arcos 𝐴 que representan
las relaciones entre vértices.
 Un arco o arista representa una relación entre dos
nodos (𝑢, 𝑣), donde 𝑢 y 𝑣 son nodos.
 Un vértice es adyacente a otro si existe un arco que
los una.
Programación II 5

6.1. Conceptos Básicos (Cont.)

 Los grafos pueden ser:

 Grafos no dirigidos: Sus arcos NO están ordenados.


Es decir: (𝑢, 𝑣) = (𝑣, 𝑢).
 Grafos dirigidos (digrafo): Sus arcos están ordenados.
Es decir: (𝑢, 𝑣) ≠ (𝑣, 𝑢).
 Grafos ponderados o valorados: Cuando las
relaciones o arcos tienen un peso o magnitud asociada.

Programación II 6

3
17/11/2015

6.1. Conceptos Básicos. (Cont.)

5
1 4 1 4 1 4
10

5 5 5
3

6
7 9 7 9 7 9

Grafo no Dirigido Grafo Dirigido Grafo Ponderado

Programación II 7

6.1. Conceptos Básicos (Cont.)

 Grado de un nodo de un grafo no dirigido: Es


el numero de arcos del nodo.
 Grado de un nodo de un grafo dirigido : En
este caso se diferencia:
 Grado de Entrada (𝑔𝑟𝑎𝑑𝑜𝑒𝑛𝑡𝑟𝑎𝑑𝑎 (𝑢)): Es la cantidad
de arcos que llegan al nodo. (flecha llega)
 Grado de Salida (𝑔𝑟𝑎𝑑𝑜𝑠𝑎𝑙𝑖𝑑𝑎 (𝑢)): Es la cantidad de
arcos que salen al nodo. (flecha sale)

Programación II 8

4
17/11/2015

6.1. Conceptos Básicos. (Cont.)

Sea 𝐺 = (𝑉, 𝐴),


𝑉 = {1 , 4 , 5 , 7 , 9} y 𝐴 =
{ (1,4) , (1,5) , (4,1) , (4, 9) , (5,1) , (5, 7) , (7, 5) , (7, 9) , (9,4) , (9,7) }

1 4
𝐺𝑟𝑎𝑑𝑜(1) = 2
Grafo
5
No Dirigido
𝐺𝑟𝑎𝑑𝑜(5) = 2
7 9 𝐺𝑟𝑎𝑑𝑜 (9) = 2

Programación II 9

6.1. Conceptos Básicos. (Cont.)

Sea 𝐺 = (𝑉, 𝐴),


𝑉 = {1 , 4 , 5 , 7 , 9} y
𝐴 = { 1,4 , 1,5 , 4, 9 , 5, 7 , 9,4 , (9,7) }

1 4
𝐺𝑟𝑎𝑑𝑜𝑒𝑛𝑡𝑟𝑎𝑑𝑎 1 = 0
Grafo 𝐺𝑟𝑎𝑑𝑜𝑠𝑎𝑙𝑖𝑑𝑎 (1) = 2
5
Dirigido
𝐺𝑟𝑎𝑑𝑜𝑒𝑛𝑡𝑟𝑎𝑑𝑎 5 = 1
7 9 𝐺𝑟𝑎𝑑𝑜𝑠𝑎𝑙𝑖𝑑𝑎 (9) = 2

Programación II 10

5
17/11/2015

6.1. Conceptos Básicos (Cont.)


 Camino de 𝒗𝟎 a 𝒗𝒏 . : Es un conjunto de arcos contiguos que
van de 𝑣0 a 𝑣𝑛 .
 Longitud de un camino: Es la suma del peso de sus arcos.
En los grafos no ponderados será igual al número de arcos que
forman el camino, sus arcos tienen peso 1.
5
1 4 1 4
10
5 5
3
7 9 6
7 9
Camino de 𝟏 a 𝟗 : P={1,4,9} Camino de 𝟏 a 𝟕 : P={1,5,7}
Longitud = 2. Longitud = 10+3=13.
Programación II 11

6.1. Conceptos Básicos (Cont.)

 Camino Simple: Si todos sus nodos de 𝑣0 a 𝑣𝑛 son distintos


excepto 𝑣0 y 𝑣𝑛 que pueden ser iguales.
 Bucle: Un camino tal que (𝑣0 , 𝑣0 ).
 Ciclo: En un grafo dirigido es un camino simple cerrado,
donde 𝑣0 = 𝑣𝑛 formado por mas de 1 arco. Si un ciclo tiene
longitud 𝑘 se llamará 𝑘 − 𝑐𝑖𝑐𝑙𝑜.
 Grafo Dirigido Acíclico (GDA): Un grafo dirigido que no tiene
ningún ciclo.
 Grafo Conexo: Un grafo no dirigido es conexo si existe un
camino entre cualquier par de nodos que forma el grafo.
 Grafo fuertemente Conexo: Si el grafo es dirigido y conexo.
Programación II 12

6
17/11/2015

6.1. Conceptos Básicos (Cont.)

 ¿Qué tipo de camino forman los vértices (1,5,2,6,1)?


 ¿Cuál es su longitud?

1 2 3  Camino simple cerrado: ciclo.


 Longitud 4, es un 4-ciclo.

4 5 6

Programación II 13

6.1. Conceptos Básicos (Cont.)

 Subgrafo : Dado un grafo un subgrafo es un grafo 𝐺’ donde


𝑉′ ⊆ 𝑉 y A′ ⊆ 𝐴

𝐺 = 𝑉, 𝐴 𝑑𝑜𝑛𝑑𝑒 𝑉 = 1,2,3,4,5,6 𝐺′ = 𝑉′, 𝐴′ 𝑑𝑜𝑛𝑑𝑒 𝑉′ = 1,2,5,6


𝐴 = { 1,5 , 2,6 , 3,6 , 5,2 , 5,4 , (6,1)} 𝐴 = { 1,5 , 2,6 , 5,2 , (6,1)}

1 2 3 1 2

4 5 6 5 6

Programación II 14

7
17/11/2015

6.2. Representación.

2
 Lista de adyacencia: Grafo disperso. 𝐴 < 𝑉 .
 Permite una representación más compacta.
 Emplea estructuras dinámicas para su representación (arreglo
de N listas o una lista de N listas).
 Ventaja: Fácilmente adaptables para grafos ponderados, facil
asignación de pesos.
 Ventaja: Menor uso de memoria apropiado para grafos sin
muchos enlaces.
 Desventaja: La búsqueda es mas lenta.

Programación II 15

6.2. Representación.

 Lista de Adyacencia (Grafo No Dirigido):


 Tantos nodos como 2|A|.

1 2 1 2 5 NULL

2 1 5 4 3 NULL

3 3 2 4 NULL

4 5 2 3 NULL

5 4 5 2 4 1 NULL

Programación II 16

8
17/11/2015

6.2. Representación.

 Lista de Adyacencia (Grafo Dirigido):


 Tantos elementos como aristas |A|.

1 2 4 NULL
1 2 3 2 5 NULL

3 5 6 NULL

4 2 NULL

4 5 6 5 4 NULL

6 6 NULL

Programación II 17

6.2. Representación.
2
 Matriz de Adyacencia: Grafo es denso. 𝐴 ∼ 𝑉 .
 Matriz de dimensión 𝑁
×𝑁
1 𝑠𝑖 𝑖, 𝑗 ∈ 𝐴
𝑀=
0 𝑠𝑖 𝑖, 𝑗 ∉ 𝐴
 Con grafos no dirigidos es simétrica 𝑀𝑇 = 𝑀.
 Emplea estructuras estáticas.
 Ventaja: Búsqueda muy rápida.
 Ventaja: Si no se necesitan costes no requiere dato adicional.
 Desventaja: Suele requerir mayor memoria, se usa en grafos más
pequeños.
 Desventaja: Si se requieren costes, se necesita mayor capacidad por
enlace
Programación II 18

9
17/11/2015

6.2. Representación.

 Matriz de Adyacencia (Grafo No Dirigido):


 Matriz simétrica
1 2 3 4 5
1 2 1 0 1 0 0 1
2 1 0 1 1 1
3 3 0 1 0 1 0
4 0 1 1 0 1
5 4 5 1 1 0 1 0

Programación II 19

6.2. Representación.

 Matriz de Adyacencia (Grafo Dirigido):


 Matriz no simétrica 1 2 3 4 5 6

1 2 3 1 0 1 0 1 0 0
2 0 0 0 0 1 0
3 0 0 0 0 1 1
4 0 1 0 0 0 0
4 5 6
5 0 0 0 1 0 0
6 0 0 0 0 0 1
Programación II 20

10
17/11/2015

6.3. Algoritmos.

 Camino más corto


 Árbol de expansión mínima
 Flujo Máximo.

Programación II 21

6.3.1. Camino más corto


 La idea principal es la de encontrar el camino con un coste
mínimo entre una fuente (S) y un destino (D).
 Algoritmos con una única fuente: camino más corto entre S y
el resto de nodos :
 Dijkstra (sólo valores positivos)
 Bellman-Ford (valores negativos)
 Algoritmos para toda la red: camino más corto entre todas las
posibles parejas de nodos en la red:
 Floyd-Warshall
 Johnson

Programación II 22

11
17/11/2015

6.3.1. Camino más corto (Cont.)


 Algoritmos con una única fuente: Encuentra el camino de
coste mínimo de una fuente S a todos los nodos en un grafo
con costes NO NEGATIVOS.

 Coste del camino


𝑘

𝑐 𝑝 = 𝑐(𝑢𝑖−1 − 𝑢𝑖 )
𝑖=1

 Coste del camino mínimo

𝑚𝑖𝑛 𝑐 𝑝 : 𝑐𝑜𝑠𝑡𝑒 𝑑𝑒 (𝑢, 𝑣) 𝑠𝑖 ℎ𝑎𝑦 (𝑢, 𝑣)


𝛿 𝑢, 𝑣 =
∞ 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟𝑎𝑟𝑖𝑜

Programación II 23

6.3.1. Camino más corto (Cont.)

 Variables:
 Conjunto de nodos 𝑄 para los que no se ha encontrado el
camino más corto.
 Se mantiene una lista con las distancias a cada nodo
𝑑(𝑢).

∀𝑢 ∈ 𝑁 − 𝑄 𝑑 𝑢 = 𝛿(𝑆, 𝑢)

Programación II 24

12
17/11/2015

6.3.1. Camino más corto (Cont.)

 Algoritmo
 Se busca en 𝑄 el nodo cuyo camino de coste mínimo sea el
menor
𝑚𝑖𝑛
𝑑 𝑢 = 𝑑(𝑣)
𝑣∈𝑄
 𝑢 se borra de 𝑄
 Si 𝑄 es el conjunto vacío (𝑄 = ∅) , se termina el algoritmo
 Para todos los nodos 𝑣 de 𝑄 adyacentes a 𝑢

𝑑 𝑣 = 𝑚𝑖𝑛{𝑑 𝑣 , 𝑑 𝑢 + 𝑐(𝑢, 𝑣)}

Programación II 25

6.3.1. Camino más corto (Cont.)


 Pseudocódigo
d(S) = 0
para ∀𝑣 ∈ 𝑁 – {𝑆} hacer
𝑑(𝑣) = ∞
fin_para
𝑄 = 𝑁
mientras 𝑄 ≠ ∅ hacer
Obtener 𝑢 ∈ 𝑄 𝑐𝑜𝑛 min{𝑑(𝑣)}
Borrar 𝑢 𝑑𝑒 𝑄
para ∀𝑣 ∈ 𝑄 𝑦 𝑒𝑠 𝑎𝑑𝑦𝑎𝑐𝑒𝑛𝑡𝑒 𝑎 𝑢 hacer
si 𝑑(𝑣) > 𝑑(𝑢) + 𝑐(𝑢, 𝑣) entonces
𝑑(𝑣) = 𝑑(𝑢) + 𝑐(𝑢, 𝑣)
𝑝𝑟𝑒𝑣 𝑣 = 𝑢
fin_si
fin_para
fin_mientras

Programación II 26

13
17/11/2015

6.3.1. Camino más corto (Cont.)

 Ejemplo:

 Inicialización:
1 1
3
10
3 2 9 𝑄 = {𝑆, 1,2,3,4}
S 6 4
𝑑 = [0, ∞, ∞, ∞, ∞]
5 7
2 2 4 𝑝𝑟𝑒𝑣 = [0,0,0,0,0]

Programación II 27

6.3.1. Camino más corto (Cont.)

 Ejemplo:

 Primera iteración:
1 1
3
10
3 2 9 𝑄 = {1,2,3,4}
S 6 4

5 7
𝑑 = [0, 𝟏𝟎, 𝟓, ∞, ∞]
2 2 4
𝑝𝑟𝑒𝑣 = [0, 𝟎, 𝟎, 0,0]

Programación II 28

14
17/11/2015

6.3.1. Camino más corto (Cont.)

 Ejemplo:

 Segunda iteración:
1 1
3
10
2 𝑄 = {1,3,4}
3 9
S 6 4

5 7 𝑑 = [0, 𝟖, 5, 𝟏𝟒, 𝟕]
2
2 4
𝑝𝑟𝑒𝑣 = [0, 𝟐, 0, 𝟐, 𝟐]

Programación II 29

6.3.1. Camino más corto (Cont.)

 Ejemplo:

 Tercera iteración:
1 1
3
10
3 2 9 𝑄 = {1,3}
S 6 4

5 7 𝑑 = [0, 8, 5, 𝟏𝟑, 7]
2
2 4
𝑝𝑟𝑒𝑣 = [0, 2, 0, 𝟒, 2]

Programación II 30

15
17/11/2015

6.3.1. Camino más corto (Cont.)

 Ejemplo:

1  Cuarta iteración:
1 3
10
3 9 𝑄 = {3}
2
S 6 4

5 7 𝑑 = [0, 8, 5, 𝟗, 7]
2
2 4
𝑝𝑟𝑒𝑣 = [0, 2, 0, 𝟏, 2]

Programación II 31

6.3.1. Camino más corto (Cont.)

 Ejemplo:

1  Quinta iteración:
1 3
10
3 2 9 𝑄=∅
S 6 4
5 7 𝑑 = [0, 8, 5, 𝟗, 7]
2
2 4
𝑝𝑟𝑒𝑣 = [0, 2, 0, 1, 2]

Programación II 32

16
17/11/2015

6.3.1. Camino más corto (Cont.)

 Ejemplo:

1  La Ruta Mínima es
1 3
10
3 2 9 𝑑 = [0, 8, 5, 9, 7]
S 6 4
7 𝑝𝑟𝑒𝑣 = [0, 2, 0, 1, 2]
5
2
2 4

Programación II 33

6.3.2. Árbol de Expansión Mínimo

 Un árbol es un grafo G, no dirigido, conectado y sin ciclos.


 El número de aristas es igual al número de nodos menos 1.
 Cualquier par de nodos están unidos por un único camino.
 G está conectado, pero al eliminar cualquier enlace dejaría de
estarlo.
 G no tiene ciclos, pero al añadir una arista cualquiera aparecería un
ciclo
 Llamado Spanning Tree, cubre todos los nodos de un grafo Q.
 El Minimum Spanning Tree (MST) es aquel que tiene un
menor coste.
 Algoritmos empleados: Kruskal y Prim
Programación II 34

17
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.)
 Algoritmo Kruskal:
 Construye el MST incorporando aristas que unan dos
componentes diferentes (dos subgrafos no conectados
entre sí)
 Se puede ver como un proceso de búsqueda de
componentes conectados en una red.
 Va recorriendo las aristas (𝑢, 𝑣) de A en orden creciente
(por su coste).
 Añade la arista actual (𝑢, 𝑣) a un subgrafo T si 𝑢 y 𝑣
pertenecen a árboles distintos
 Siempre se añade aquel que tenga un menor coste.

Programación II 35

6.3.2. Árbol de Expansión Mínimo


(Cont.)
 Algoritmo Kruskal:
 Variables:
 T: Conjunto de aristas que forman el MST
 L: lista con las aristas de G, ordenados según su coste, en orden
creciente
 Al recorrer todos las aristas T contendrá el MST de G
 Componentes Conexas: aristas que forman un árbol.
(𝑢, 𝑣) esta en ala misma componente conexa si ambos
vértices están en el mismo árbol

Programación II 36

18
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.)
 Pseudocódigo

T= ∅
𝐿 =𝐴
Ordenar(L)
para ∀(𝑢, 𝑣) ∈ 𝐿 (𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑜) hacer
si 𝑢 𝑦 𝑣 ∈
𝑎𝑙 𝑚𝑖𝑠𝑚𝑜 𝑎𝑟𝑏𝑜𝑙 (𝑎𝑚𝑏𝑜𝑠 𝑣𝑒𝑟𝑡𝑖𝑐𝑒𝑠 𝑒𝑛 𝑐𝑜𝑚𝑝𝑜𝑛𝑒𝑛𝑡𝑒 𝑐𝑜𝑛𝑒𝑥𝑎) entonces
descartar (𝑢, 𝑣)
else
𝐴 = 𝐴 ∪ (𝑢, 𝑣)
fin_si
fin_para

Programación II 37

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1

 Ejemplo: Sea el grafo: (3,5) 2


(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(4,8) 14

Programación II 38

19
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1

 Ejemplo: Primera Iteración (3,5) 2


(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(6,7) (4,8) 14

Programación II 39

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1

 Ejemplo: Segunda Iteración (3,5) 2


(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(6,7) (3,5) (2,6) 11
(4,8) 14

Programación II 40

20
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1

 Ejemplo: Tercera Iteración (3,5) 2


(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10

(6,7) (7,8) (3,5) (2,6) 11


(4,8) 14

Programación II 41

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1

 Ejemplo: Cuarta Iteración (3,5) 2


(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(6,7) (7,8) (3,5) (1,2) (4,8) 14

Programación II 42

21
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1

 Ejemplo: Quinta Iteración (3,5) 2


(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(6,7) (7,8) (3,8) (3,5) (1,2) (4,8) 14

Programación II 43

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1

 Ejemplo: Sexta Iteración (3,5) 2


(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(4,8) 14

Programación II 44

22
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Séptima Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(6,7) (7,8) (3,8) (3,4) (3,5) (1,2) (4,8) 14

Programación II 45

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Octava Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(6,7) (7,8) (3,8) (3,4) (3,5) (1,2) (4,8) 14

Programación II 46

23
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Novena Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(1,2) (1,6) (6,7) (7,8) (3,8) (3,4) (3,5) (4,8) 14

Programación II 47

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Decima Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(4,8) 14
(1,2) (1,6) (6,7) (7,8) (3,8) (3,4) (3,5)

Programación II 48

24
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Onceava Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(1,2) (1,6) (6,7) (7,8) (3,8) (3,5) (3,4) (4,9) (4,8) 14

Programación II 49

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Doceava Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(1,2) (1,6) (6,7) (7,8) (3,8) (3,5) (3,4) (4,9) (4,8) 14

Programación II 50

25
17/11/2015

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Treceava Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(1,2) (1,6) (6,7) (7,8) (3,8) (3,5) (3,4) (4,9) (4,8) 14

Programación II 51

6.3.2. Árbol de Expansión Mínimo


(Cont.) arista peso
(6,7) 1
(3,5) 2
 Ejemplo: Catorceava Iteración
(7,8) 3
(1,2) 4
(3,8) 4
(5,7) 6
(3,4) 7
(5,6) 7
(1,6) 8
(2,3) 8
(4,9) 9
(8,9) 10
(2,6) 11
(1,2) (1,6) (6,7) (7,8) (3,8) (3,5) (3,4) (4,9) (4,8) 14

Programación II 52

26

También podría gustarte