Está en la página 1de 102

APUNTE Nº6

TIPOS DE DATOS ABSTRACTOS NO LINEALES:


GRAFOS
Algoritmos y Estructuras de Datos

Irene Zuccar Parrini


2022
Grafos
Definición de grafo:

▪ Un grafo es un modelo matemático.

▪ Un grafo G, está compuesto por 2 subconjuntos V y A finitos: G(V, A) (V ≠ ).

▪ El conjunto V contiene los nodos o vértices del grafo.

▪ El conjunto de pares (VxV) llamado A, contiene las aristas o arcos, que relacionan a los nodos de V.

▪ Gráficamente, los vértices se representan por puntos o círculos etiquetados y las aristas por líneas que los
unen. Ejemplo gráfico:

1
V = {1, 2, 3, 4, 5}
2 3 4 A = {(1,2), (1,3), (2,3), (1,4), (3,5), (4,5)}

2
Grafos
Historia:

Los grafos fueron usados inicialmente por Euler, en 1736, para representar el problema de las ciudades y los
puentes.

Representación de los siete puentes de Königsberg, que cruzan el río Pregel.

V = {A,B,C,D}: conjunto de ciudades.


A = {(A,B),(A,B),(A,C),(A,C),(C,D),(A,D),(B,D)}: pares de localidades unidas con un puente.

Problema:
“Encontrar un recorrido para cruzar a pie toda la ciudad, pasando sólo una vez por cada uno de los
puentes, y regresando al mismo punto de inicio”
3
Grafos
Tipos de Grafos:

▪ Grafo No Dirigido: Es un grafo G(V, A), en el que A es un conjunto de pares NO ordenados.

1
Grafo No Dirigido G (V, A) con:
V = {1, 2, 3, 4, 5}
2 3 4 A = {(1,2), (1,3), (2,3), (1,4), (3,5), (4,5)}

▪ Grafo Dirigido o Digrafo: Es un grafo G(V, A), en el que A es un conjunto de pares ordenados.

1
Grafo Dirigido G (V, A ) con:
V = {1, 2, 3, 4, 5}
2 3 4
A = {(1,2), (1,3), (2,3), (3,4), (3,5), (4,5), (5,4)}

4
Grafos
Representación Computacional:
▪ Matriz de Adyacencia: Matriz de orden nn, donde n es el número de nodos del grafo.
▪ Las posiciones de las filas y de las columnas representan a los n nodos.

• Grafos NO dirigidos: habrá un 1 en la posición [i, j] y en la posición [j, i], si existe un arco que une a los nodos i y j.
(Habrá un 0 en caso contrario)
1 2 3 4 5
1
1 0 1 1 1 0
Grafo No Dirigido G (V, A) con: 2 1 0 1 0 0
4 V = {1, 2, 3, 4, 5} 3 1 1 0 0 1
2 3
A = {(1,2), (1,3), (2,3), (1,4), (3,5), (4,5)} 4 1 0 0 0 1
5 0 0 1 1 0
5

• Grafos dirigidos: habrá un 1 en la posición [i, j], si existe un arco que va DESDE i HASTA a j EN ESE ORDEN. (Habrá un 0
en caso contrario)
1 2 3 4 5
1
1 0 1 1 0 0
Grafo Dirigido G (V, A ) con: 2 0 0 1 0 0
2 3 4 V = {1, 2, 3, 4, 5} 3 0 0 0 1 1
A = {(1,2), (1,3), (2,3), (3,4), (3,5), (4,5), (5,4)} 4 0 0 0 0 1
5 0 0 0 1 0
5
5
Grafos
Tipos de Grafos:

▪ Grafo Valuado o Ponderado: Grafo en el que se asocian valores a sus arcos: distancia, costo, capacidad,
etc.

▪ Pueden ser dirigidos o no dirigidos.

1 1
10 3 10
6 6
2 3 4 7 4
2 2 3
2
5 7 5 1
5 7
5

6
Grafos
Representación Computacional de un Grafo Valuado:

▪ Matriz de Costos: Matriz de orden nn, donde n es el número de nodos del grafo. Representa a los grafos
valuados.
• Grafos no dirigidos: en la posición [i, j] y en la posición [j, i], está el valor del arco que une a los nodos i y j. (Habrá un 0
en caso contrario).

1 1 2 3 4 5
10 3
6 1 0 10 6 3 0
4 2 10 0 2 0 0
2 3
2 3 6 2 0 0 5
5 7 4 3 0 0 0 7
5 5 0 0 5 7 0

• Grafos dirigidos: en la posición [i, j], se encontrará el valor del arco que va DESDE i HASTA a j EN ESE ORDEN (Habrá un 0
en caso contrario).
1 1 2 3 4 5
10
6 1 0 10 6 0 0
7 4 2 0 0 2 0 0
2 3
2 3 0 0 0 7 5
5 1
4 0 0 0 0 1
7 5 0 0 0 7 0
5

7
EJEMPLOS DE APLICACIONES DE LOS GRAFOS
Ejemplo 1: Red del metro de Santiago.

9
Ejemplo 2: redes sociales.

10
Ejemplo 3: Representación de moléculas

11
Ejemplo 4: Circuitos eléctricos

12
Ejemplo 5: Diagramas de flujos

13
Ejemplo 6: Red de Recomendación musical

14
Ejemplo 7: Red funcional de un cerebro

15
Ejemplo 8: Red de comunicación del epigenoma

16
Ejemplo 9: Modelamiento de malabares (con pelotas)

17
Ejemplo 9: ”GRAPH everywhere”: empresa dedicada a desarrollo de
soluciones y servicios de consultoría usando GRAFOS

18
Ejemplo 10: Segmento de un modelo para detectar lavado de dinero (de
GRAPH everywhere)

* También mencionan bases de datos NoSQL, sustentadas en grafos.


19
DEFINICIONES SOBRE GRAFOS
Grafos
Algunas definiciones sobre grafos:

▪ Lazo o Bucle: Arista que une a un vértice consigo mismo.

▪ Para un Grafo NO Dirigido:


1 2 3 4 5
1 1 0 1 1 1 0
G(V, A):
V = {1, 2, 3, 4, 5} 2 1 0 1 0 0
2 3 4 A = {(1,2), (1,3), (2,3), (1,4), (3,5), (4,4), (4,5)} 3 1 1 0 0 1
4 1 0 0 1 1
5 0 0 1 1 0
5

▪ Para un Grafo Dirigido:

1
1 2 3 4 5
G (V, A ): 1 0 1 1 0 0
V = {1, 2, 3, 4, 5} 2 0 0 0 0 0
2 3 4
A = { (1,2), (1,3), (3,2), (3,4), (3,5), (4,4), (4,5), (5,4)} 3 0 1 0 1 1
4 0 0 0 1 1
5 5 0 0 0 1 0

21
Grafos
Algunas definiciones sobre grafos NO DIRIGIDOS:

▪ Nodos Adyacentes: Nodos que poseen una arista en común.

En G(V, A):

 ady(1) = {2, 3, 4}  ady(2) = {1, 3}  ady(3) = {1, 2, 5}  ady(4) = {1, 4, 5}  ady(5) = {3, 4}

1 1 2 3 4 5
G(V, A): 1 0 1 1 1 0
V = {1, 2, 3, 4, 5} 2 1 0 1 0 0
2 3 4
A = {(1,2), (1,3), (2,3), 3 1 1 0 0 1
(1,4), (3,5), (4,4), (4,5)} 4 1 0 0 1 1
5 0 0 1 1 0
5

▪ Grado de un nodo: Número de aristas incidentes en el nodo. Si el nodo posee un lazo, se debe contar por
dos.

En G(V, A):

 gr(1) = 3  gr(2) = 2  gr(3) = 3  gr(4) = 4  gr(5) = 2

22
Grafos
Algunas definiciones sobre grafos NO DIRIGIDOS:

▪ Arcos Adyacentes: Arcos que inciden en un nodo común.

En G(V, A):
1 2 3 4 5
- ady((1,2)) = {(2,3), (1,3), (1,4)} 1 0 
1 1 1 0
-
-
ady((1,3)) = {(1,2), (2,3), (1,4), (3,5)}
ady((2,3)) = {(1,2), (1,3), (3,5)}
2 
1 0 1 0 0
3 1 1 0 0 1
- ady((1,4)) = {(1,2), (1,3), (4,4), (5,4)} 4 1 0 0 1 1
- ady((4,4)) = {(1,4), (4,5)} 5 0 0 1 1 0
- ady((3,5)) = {(1,3), (2,3), (4,5)}
- ady((4,5)) = {(3,5), (1,4), (4,4)}

1
G (V, A) :
V = {1, 2, 3, 4, 5}
2 3 4
A = {(1,2), (1,3), (2,3), (1,4), (3,5), (4,4), (4,5)}

23
Grafos
Algunas definiciones sobre grafos DIRIGIDOS:

▪ Antecesor y Sucesor de un Nodo: En un grafo dirigido, si (v, w)  A, se dice que v es antecesor de w, y que
w es sucesor de v.

▪ Si un nodo posee un bucle, entonces se cuenta a sí mismo como un antecesor y como un sucesor.

En G(V, A):

 Ant(1) = {} =   Ant(2) = {1,3}  Ant(3) = {1}  Ant(4) = {3,4,5}  Ant(5) = {3,4}

 Suc(1) = {2,3}  Suc(2) = {} =   Suc(3) = {2,4,5}  Suc(4) = {4,5}  Suc(5) = {4}


1
Grafo Dirigido G (V, A ) con:
V = {1, 2, 3, 4, 5}
2 3 4
A = { (1,2), (1,3), (3,2), (3,4), (3,5), (4,4), (4,5), (5,4)}

5
1 2 3 4 5
1 0 1 1 0 0
2 0 0 0 0 0
3 0 1 0 1 1
4 0 0 0 1 1
5 0 0 0 1 0 24
Grafos
Algunas definiciones sobre grafos DIRIGIDOS:

▪ Grado de entrada de un Nodo: En un grafo dirigido, se conoce como grado de entrada de un nodo v
(𝒈𝒓− 𝒗 ), al número de antecesores que posea.

En G(V, A): 1
1 2 3 4 5
Grafo Dirigido G (V, A ) con:
1 0 1 1 0 0
V = {1, 2, 3, 4, 5}
2 3 4 2 0 0 0 0 0
A = { (1,2), (1,3), (3,2), (3,4), (3,5), (4,4), (4,5), (5,4)}
3 0 1 0 1 1
4 0 0 0 1 1
5 5 0 0 0 1 0

𝑔𝑟 − 1 = 0 𝑔𝑟 − 2 = 2 𝑔𝑟 − 3 = 1 𝑔𝑟 − 4 = 3 𝑔𝑟 − 5 = 2

▪ Grado de salida de un Nodo: En un grafo dirigido, se conoce como grado de salida de un nodo v
(𝒈𝒓+ 𝒗 ), al número de sucesores que posea.
𝑔𝑟 + 1 = 2 𝑔𝑟 + 2 = 0 𝑔𝑟 + 3 = 3 𝑔𝑟 + 4 = 2 𝑔𝑟 + 5 = 1

25
Grafos
Algunas definiciones sobre grafos DIRIGIDOS:

▪ Nodo Sumidero: Nodo u de un grafo dirigido que sólo posee nodos antecesores y ningún nodo sucesor.
Es decir: 𝑔𝑟 − 𝑢 ≠ 0 y 𝑔𝑟 + 𝑢 = 0

En G(V, A): 1 1 2 3 4 5
Grafo Dirigido G (V, A ) con: 1 0 1 1 0 0
V = {1, 2, 3, 4, 5} 2 0 0 0 0 0
2 3 4 A = { (1,2), (1,3), (2,3), (3,4), (3,5), (4,4), (4,5), (5,4)} 3 0 1 0 1 1
4 0 0 0 1 1
5 0 0 0 1 0
5

- 𝑆𝑢𝑚 𝐺Ԧ = 2

▪ Nodo Fuente: Nodo u de un grafo dirigido sólo posee nodos sucesores y ningún nodo antecesor. Es
decir: 𝑔𝑟 − 𝑢 = 0 y 𝑔𝑟 + 𝑢 ≠ 0

- 𝐹𝑡𝑒 𝐺Ԧ = 1

26
Grafos
Algunas definiciones sobre grafos:

▪ Camino desde un nodo u hasta un nodo v: Secuencia sin repetición de nodos, que parte con el nodo u y
avanza a través de nodos adyacentes para terminar en el nodo v (es decir, avanza a través de los arcos).

▪ En los grafos dirigidos, se debe respetar el sentido de la arista; si no se toma en cuenta se llama Cadena.

▪ Largo de un camino: Número de aristas del camino (o número de nodos menos 1).

Camino desde 3 a 5: Camino de 1 a 4:


1 1
<3, 5> <1, 3, 5, 4>
<3, 1, 4, 5> <1, 3, 4>
4 <3, 2, 1, 4, 5>
2 3 2 3 4 ¿Cuál es el largo de
¿Cuál es el largo de cada camino?
cada camino? 3y2
5 1, 3 y 4 5
Cadena de 1 a 4:
<1, 4>
<1, 2, 3, 5, 4>
▪ Ciclo: Camino que inicia y termina en el mismo nodo.

Ciclo desde 3: Ciclo desde 3:


1 1
<3, 2, 1, 4, 5, 3> < 3, 2, 1, 3>
<3, 2, 1, 3> < 3, 4, 1, 3>
2 3 4 4
2 3

5 27
5
Grafos
Algunas definiciones sobre grafos:
▪ Subgrafo: Grafo en el que sus conjuntos V y A son subconjuntos de un grafo mayor.
Ejemplos:
1 1
G(V, A): G (V, A ):
V = {1, 2, 3, 4, 5} V = {1, 2, 3, 4, 5}
2 3 4 A = {(1,2), (1,3), (2,3), 4 A = { (1,2), (1,3), (3,2), (3,4),
2 3
(1,4), (3,5), (4,4), (4,5)} (3,5), (4,4), (4,5), (5,4)}
5
5

• G1(V1, A1): V1 = {3, 4, 5} • G3(V3, A3): V3 = {1, 3, 4} • G1(V1, A1): V1 = {1, 2, 3}


A1 = {(3,5), (4,4), (4,5)} A3 = {(1,4), (1,3), (3,4)} A1 = {(1,2), (1,3), (3,2)}
1 1
3 4

3 4
2 3
5
• G2(V2, A2): V2 = {3, 4, 5}
• G2(V2, A2): V2 = {3, 4, 5} • G4(V4, A4): V4 = {1, 3, 4} A2 = {(3,4), (5,3), (4,4)}
A2 =  A4 = {(1,4), (1,3), (1,2)}

4 1 3 4
3
5
3 4
5
28
ALGORITMOS CLÁSICOS SOBRE GRAFOS
Grafos – Caminos Mínimos (Dijkstra)
1. Caminos Mínimos en Grafos (Dijkstra):

- Este FAMOSO algoritmo permite construir todos los caminos de costo mínimo desde un nodo al resto
de los nodos de un grafo valuado.

- Los parámetros de entrada al algoritmo son: El grafo valuado y el nodo inicial.

- El grafo puede ser dirigido o no dirigido.

- Los costos del grafo siempre deben ser positivos.

- El grafo puede ser no valuado: en este caso calcula el camino de largo menor (menor número de arcos).

Ejemplo: Aplicar el algoritmo de Dijkstra al siguiente grafo a partir del nodo 1 (es decir, v0 = 1).

v0

30
Grafos – Caminos Mínimos (Dijkstra)

8 (1)  (1)
Visitado = F
V F F F F F
1 2 3 4 5 6

costoAcum = - 8  7  
1 2 3 4 5 6

nodoAnt = - 1 1 1 1 1
v0 * 1 2 3 4 5 6

 (1)

7 (1)  (1)

Paso 1: Marca a v0 como visitado (poner un * en el nodo)


Paso 2: Inicialización para cada nodo:
1. Escribe el costo para ir desde v0 a ese nodo. Si no hay arco coloca  (valor azul subrayado).
2. Escribe el nodo desde donde se calculó ese costo: v0 (valor verde entre paréntesis).

31
Grafos – Caminos Mínimos (Dijkstra)

8 (1)  (1)
Visitado = V F F VF F F
1 2 3 4 5 6

costoAcum = - 8  7  
1 2 3 4 5 6

nodoAnt = - 1 1 1 1 1
v0 * 1 2 3 4 5 6

 (1)

7 (1)  (1)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)

32
Grafos – Caminos Mínimos (Dijkstra)

8 (1)

 (1) ¿7+14 < ?
R: Sí Visitado = V F F V F F
1 2 3 4 5 6

costoAcum = - 8  7  
1 2 3 4 5 6

nodoAnt = - 1 1 1 1 1
v0 * 1 2 3 4 5 6

 (1)

7 (1)  (1)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
33
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 21(4) ¿7+14 < ?


R: Sí Visitado = F
V F F V F F
1 2 3 4 5 6

costoAcum = - 8 
21 7  
1 2 3 4 5 6

nodoAnt = - 1 14 1 1 1
v0 * 1 2 3 4 5 6

 (1)

7 (1)  (1)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
34
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 21(4)
Visitado = F
V F F V F F
1 2 3 4 5 6

costoAcum = - 8 21 7  
1 2 3 4 5 6

nodoAnt = - 1 4 1 1 1
v0 * 1 2 3 4 5 6

 (1)

7 (1)

 (1) ¿7+11 < ?
R: Sí

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
35
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 21(4)
Visitado = F
V F F VF F F
1 2 3 4 5 6

costoAcum = - 8 21 7 
18 
1 2 3 4 5 6

nodoAnt = - 1 4 1 41 1
v0 * 1 2 3 4 5 6

 (1)

7 (1) 18(4) ¿7+11 < ?


R: Sí

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
36
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 21(4)
Visitado = V VF F V F F
*
1 2 3 4 5 6

costoAcum = - 8 21 7 18 
1 2 3 4 5 6

nodoAnt = - 1 4 1 4 1
v0 * 1 2 3 4 5 6

 (1)

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)

37
Grafos – Caminos Mínimos (Dijkstra)

8 (1)

21(4) ¿8+10 < 21?
R: Sí Visitado = V V F V F F
*
1 2 3 4 5 6

costoAcum = - 8 21 7 18 
1 2 3 4 5 6

nodoAnt = - 1 4 1 4 1
v0 * 1 2 3 4 5 6

 (1)

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y marcarlo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
38
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2) ¿8+10 < 21?


R: Sí Visitado = V V F V F F
*
1 2 3 4 5 6

costoAcum = - 8 21
18 7 18 
1 2 3 4 5 6

nodoAnt = - 1 2
4 1 4 1
v0 * 1 2 3 4 5 6

 (1)

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y marcarlo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
39
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V F V F F
*
1 2 3 4 5 6

costoAcum = - 8 18 7 18 
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 1
v0 * 1 2 3 4 5 6

 (1)

7 (1) 18(4) ¿8+12 < 18?


R: No

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y marcarlo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?

40
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V F
V V F F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 1
v0 * 1 2 3 4 5 6

 (1)

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)

41
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V V V F F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 1
v0 * 1 2 3 4 5 6

 (1)

7 (1) 18(4) ¿18+6 < 18?


R: No

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?

42
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V V V F F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 1
v0 * 1 2 3 4 5 6


 (1) ¿18+9 < ?
R: Sí
*

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
43
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V V V F F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 
27
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 31
v0 * 1 2 3 4 5 6

27(3) ¿18+9 < ?


R: Sí
*

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
44
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V V V F
V F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 27
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 3
v0 * 1 2 3 4 5 6

27(3)

* *

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)

45
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V V V V F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 27
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 3
v0 * 1 2 3 4 5 6


27(3)
¿18+5 < 27?
R: Sí
* *

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
46
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V V V V F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 23
27
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 3
5
v0 * 1 2 3 4 5 6

23(5)
¿18+5 < 27?
R: Sí
* *

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)


Paso 3: Escoge el nodo de menor costo sin marcar y márcalo (poner *).
Paso 4: Para cada sucesor sin marcar del nodo escogido: (adyacente – para un grafo no dirigido)
• ¿Es menor el costo de llegar al sucesor a través del nodo escogido, que el costo que ya tiene?
• Si lo es, cambia el costo para llegar al sucesor, y el nodo anterior (valores azul y verde)
47
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18(2)
Visitado = V V V V V F
* * 1 2 3 4 5 6

costoAcum = - 8 18 7 18 23
1 2 3 4 5 6

nodoAnt = - 1 2 1 4 5
v0 * 1 2 3 4 5 6

23(5)

* *

7 (1) 18(4)

Proceso Repetitivo: (Mientras quede más de un nodo sin marcar)

48
Grafos – Caminos Mínimos (Dijkstra)

8 (1) 18 (2)

v0 23 (5)

7 (1) 18 (4)

Reconstrucción de los caminos mínimos y sus costos: Lo que realmente se usa son estos 2 arreglos:
1 → 2: 1 2 Costo: 8
1 → 3: 1 2 3 Costo: 18 costoAcum = - 8 18 7 18 23
1 → 4: 1 4 Costo: 7 1 2 3 4 5 6

1 → 5: 1 4 5 Costo: 18 nodoAnt = - 1 2 1 4 5
1 → 6: 1 4 5 6 Costo: 23 1 2 3 4 5 6
49
Grafos – Caminos Mínimos (Dijkstra)
Arreglos Dijkstra(Num C[n][n], Num v0)
{ 18 (2)
BOOL Visitado[n];
8 (1)
Num CostoAcum[n], NodoAnt[n], i, j;
i = 1;
MIENTRAS (i ≤ n) HACER {
Visitado[i] = FALSO;
i = i + 1;
}
Visitado[v0] = VERDADERO;
i = 1; v0 23 (5)
MIENTRAS i ≤ n HACER {
SI (C[v0][i] 0) ENTONCES {
CostoAcum[i] = C[v0][i];
SINO
CostoAcum[i] = ;
}
NodoAnt[i] = v0;
i = i + 1; 7 (1) 18 (4)
}
MIENTRAS NumeroNodosSinVisitar(Visitados) > 1 HACER
{
w = NodoMinimoCostoSinVisitar(CostoAcum); (escoge al nodo “w” sin visitar, que posea el menor costo acumulado)
Visitado[w] = VERDADERO;
j = 1;
MIENTRAS (j ≤ n) HACER {
SI ((C[w][j]  0) Y (Vistado[j] == FALSO)) ENTONCES { //(si “j” es adyacente a “w” y no ha sido visitado: )
SI (CostoAcum[w] + C[w][j]  CostoAcum[j]) ENTONCES {
NodoAnt[j] = w;
CostoAcum[j] = CostoAcum[w] + C[w][j];
}
}
j = j + 1;
}
}
RETORNAR NodoAnt, CostoAcum;
}
50
Grafos – Caminos Mínimos (Dijkstra)
8 (1) 18 (2)
Num NumeroNodosSinVisitar(BOOL Visitados[n])
{
Num i, cont;
i = 1;
cont = 0;
MIENTRAS (i ≤ n) HACER {
SI (Visitado[i] == FALSO) ENTONCES {
cont = cont + 1;
} v0 23 (5)
i = i + 1;
}
RETORNAR cont;
}

Num NodoMinimoCostoSinVisitar(Num CostoAcum[n], BOOL Visitados[n])


{
Num i, nodo, minimo;
7 (1) 18 (4)
BOOL esElPrimero = VERDADERO;
i = 1;
MIENTRAS (i ≤ n) HACER {
SI (Visitado[i] == FALSO) ENTONCES {
SI (esElPrimero == VERDADERO) ENTONTES {
minimo = Costo[i];
nodo = i;
esElPrimero = FALSO;
}
SINO {
SI (CostoAcum[i] < minimo) ENTONCES {
minimo = CostoAcum[i];
nodo = i;
}
}
}
i = i + 1;
}
RETORNAR nodo;
} 51
Grafos – Árbol de Cobertura Mínimo (Kruskal)
2(a) Árbol de Cobertura Mínimo (Kruskal): A partir de un grafo NO Dirigido y valuado, permite encontrar
aquel árbol, sub|grafo del inicial (debe poseer todos los nodos), que sea de costo mínimo

(Proceso Manual)

ÁRBOL: Todos los


nodos deben quedar
conectados, pero no
debe quedar con
ningún ciclo.

7
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
3 1 (6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

4
2

3 6
𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 , 𝟐, 𝟕 𝟔 , 𝟑, 𝟔 𝟕

Costo ACM: 26 52
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor;

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓, 𝟔, 𝟕, 𝟖 53
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

¿Los nodos 3 y 5 están


¿W1W2? R: SI  desconectados?
R: SI
W1 W2

𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓, 𝟔, 𝟕, 𝟖 54
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

¿Los nodos 3 y 5 están


¿W1W2? R: SI  desconectados?
R: SI
W1W
1 W2 W2

𝑽𝑺 = 𝟏 , 𝟐 , 𝟑,
𝟑𝟓 , 𝟒, 𝟒
, 𝟓, 𝟔
, 𝟔, 𝟕
, 𝟕, 𝟖
, 𝟖 𝑻= 𝟑, 𝟓 𝟏 55
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

¿Los nodos 1 y 4 están


¿W1W2? R: SI  desconectados?
R: SI
W1 W2

𝑽𝑺 = 𝟏 , 𝟐 , 𝟑, 𝟓 , 𝟒 , 𝟔 , 𝟕 , 𝟖 𝑻= 𝟑, 𝟓 𝟏 56
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

¿Los nodos 1 y 4 están


¿W1W2? R: SI  desconectados?
R: SI
W1W1 W2 W2

𝑽𝑺 = 𝟏𝟒
𝟏, , 𝟐, 𝟐
, 𝟑,
, 𝟑,
𝟓𝟓, 𝟒, 𝟔
, 𝟔, 𝟕
, 𝟕, 𝟖
, 𝟖 𝟐
𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 57
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

¿Los nodos 1 y 2 están


¿W1W2? R: SI  desconectados?
R: SI
W1 W2

𝑽𝑺 = 𝟏, 𝟒 , 𝟐 , 𝟑, 𝟓 , 𝟔 , 𝟕 , 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 58
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

¿Los nodos 1 y 2 están


¿W1W2? R: SI  desconectados?
R: SI
WW11  WW
22

𝟑
𝑽𝑺 = 𝟏, 𝟒
𝟐, 𝟒
, 𝟐, 𝟑,
, 𝟑,
𝟓 𝟓, 𝟔
, 𝟔, 𝟕
, 𝟕, 𝟖
, 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 59
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

¿Los nodos 7 y 8 están


¿W1W2? R: SI  desconectados?
R: SI
W1 W2

𝑽𝑺 = 𝟏, 𝟐, 𝟒 , 𝟑, 𝟓 , 𝟔 , 𝟕 , 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 60
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3
¿Los nodos 7 y 8 están
¿W1W2? R: SI  desconectados?
R: SI
W W
W1 1 W22
𝑽𝑺 = 𝟏, 𝟐, 𝟒 , 𝟑, 𝟓 , 𝟔 , 𝟕,
𝟕𝟖 , 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 61
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
(2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3
¿Los nodos 2 y 5 están
¿W1W2? R: SI  desconectados?
R: SI
W1 W2

𝑽𝑺 = 𝟏, 𝟐, 𝟒 , 𝟑, 𝟓 , 𝟔 , 𝟕, 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 62
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3
¿Los nodos 2 y 5 están
¿W1W2? R: SI  desconectados?
R: SI
W W
W11  W2 2

𝑽𝑺 = 𝟏, 𝟐, 𝟑,
𝟒 𝟒,
, 𝟑,
𝟓 𝟓, 𝟔
, 𝟔, 𝟕,
, 𝟕,
𝟖𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 63
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3
¿Los nodos 1 y 3 están
¿W1W2? R: NO  desconectados?
R: NO
W1 W2

𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓 , 𝟔 , 𝟕, 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 64
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3
¿Los nodos 2 y 3 están
¿W1W2? R: NO  desconectados?
R: NO
W1 W2

𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓 , 𝟔 , 𝟕, 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 65
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3
¿Los nodos 2 y 7 están
¿W1W2? R: SI  desconectados?
R: SI
W1 W2

𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓 , 𝟔 , 𝟕, 𝟖 𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 66
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3 6
¿Los nodos 2 y 7 están
¿W1W2? R: SI  desconectados?
R: SI
WW11  W2 W2
𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 , 𝟐, 𝟕 𝟔
𝑽𝑺
𝑽𝑺 =
= 𝟏,
𝟏,𝟐,
𝟐,𝟑,
𝟑,𝟒,
𝟒,𝟓𝟓,,𝟕,𝟔𝟖, , 𝟕,𝟔𝟖 𝑻 = 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 67
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3 6
¿Los nodos 2 y 8 están
¿W1W2? R: NO  desconectados?
R: NO
W1 W2
𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 , 𝟐, 𝟕 𝟔
𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓, 𝟕, 𝟖 , 𝟔 68
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T;
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3 6
¿Los nodos 3 y 6 están
¿W1W2? R: SI  desconectados?
R: SI
W1 W2
𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 , 𝟐, 𝟕 𝟔
𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓, 𝟕, 𝟖 , 𝟔 69
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T; 7
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3 6
¿Los nodos 3 y 6 están
¿W1W2? R: SI  desconectados?
R: SI
W1 W1 W2 W2
𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 , 𝟐, 𝟕 𝟔 , 𝟑, 𝟔 𝟕
𝑽𝑺
𝑽𝑺 =
= 𝟏,
𝟏, 𝟐,
𝟐, 𝟑,
𝟑, 𝟒,
𝟒, 𝟓,
𝟓, 𝟔,
𝟕, 𝟕,
𝟖 𝟖, 𝟔 70
u v
Grafos – Árbol de Cobertura Mínimo (Kruskal)
Conjunto Kruskal(G(A,V): Grafo Valuado Conexo No Dirigido)
{
T = VACIO; (Lista de aristas que forman al Árbol de Cobertura Mínimo. Salida)
VS = VACIO; (Conjunto de conjuntos de vértices)
Q = Lista de Aristas ordenadas según costo de menor a mayor:

PARA CADA v  V HACER


VS = Insertar({v}, VS);
MIENTRAS (|VS| > 1 Y Q ≠ VACÍO) HACER
{
(u,v) = Sacar del principio de Q;
SI (u  W1) Y (v  W2) Y (W1 ≠ W2) ENTONCES
{
Reemplazar en VS: W1 y W2 por W1  W2;
T = Insertar((u,v), T);
}
}
RETORNAR T; 7
}

3 1
Q = {(3, 5)1, (1, 4)2, (1, 2)3, (7, 8)3, (2, 5)4, (1, 3)5,
4 (2, 3)5, (2, 7)6, (2, 8)6, (3, 6)7, (2, 4)8, (3, 7)9,
2
(6, 8)9, (1, 8)10, (4, 5)12, (4, 8)14, (5, 7)15}

3 6

𝑻= 𝟑, 𝟓 𝟏 , 𝟏, 𝟒 𝟐 , 𝟏, 𝟐 𝟑 , 𝟕, 𝟖 𝟑 , 𝟐, 𝟓 𝟒 , 𝟐, 𝟕 𝟔 , 𝟑, 𝟔 𝟕

𝑽𝑺 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓, 𝟔, 𝟕, 𝟖 Costo ACM: 26 71
Grafos – Árbol de Cobertura Mínimo (Prim)
2.(b) Árbol de Cobertura Mínimo (Prim): A partir de un grafo NO Dirigido y valuado, permite encontrar
aquel árbol, subgrafo del inicial (debe poseer todos los nodos), que sea de costo mínimo.

Conjunto Prim(G(A,V): Grafo Valuado Conexo No Dirigido)


{
T = ; (Conjunto con las aristas que corresponden al ACM. Salida)
N = {Escoger cualquier vértice de V};

MIENTRAS (N  V) HACER
{
Escoger (u,v) de A de costo mínimo tal que u  N ó v  N (pero no ambos);
N = N  {x}; //x es el nodo u ó v, que no estaba en N.
T = T  {(u,v)};
}
RETORNAR T; 𝑽 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓, 𝟔, 𝟕, 𝟖
x x
} x

x
x

𝑵= 𝟓
𝟓, 𝟑,
𝟑𝟐 𝟐, 𝟏
𝟏, 𝟒,
𝟒 𝟕,
𝟕 𝟖,
𝟖𝟔

𝟑, 𝟓 𝟏𝟏, 𝟐, 𝟓 𝟒𝟒, 𝟏, 𝟐 𝟑 , 𝟏, 𝟒 𝟐 , 𝟐, 𝟕 𝟔 , 𝟕, 𝟖 𝟑 , 𝟑, 𝟔
𝑻 = 𝟑, 𝟕
x x
Costo ACM: 26
72
Grafos – Recorrido en Profundidad
3. Recorridos en Grafos. Recorrido en Profundidad: Consiste en visitar un vértice de partida v0,
marcarlo como visitado y luego para cada vértice adyacente a v0, visitarlo en profundidad
(RECURSIVAMENTE: El algoritmo es recursivo porque se llama así mismo).

BOOL Visitado[n]; //Todas las celdas inicializadas en FALSO (“sin visitar”)


M: Matriz de Adyacencia orden n

Nada ProfundidadRec(nodo: nodo inicial)


{
Num i;

Visitado[nodo] = VERDADERO;
ESCRIBIR(nodo);

i = 1;

MIENTRAS (i ≤ n) HACER {
SI (M[nodo][i] ≠ 0) ENTONCES { //si “i” es adyacente o sucesor al “nodo”...
SI (Visitado[i] == FALSO) ENTONCES //... además “i” no está visitado ...
ProfundidadRec(i); //Visitarlo en “profundidad”
}
i = i + 1;
}
}

73
Grafos – Recorrido en Profundidad
Ejemplo. Realice un recorrido en profundidad para el siguiente grafo, partiendo desde nodo = 6:
BOOL Visitado[n];
Num M[n][n]; Matriz de Adyacencia orden n;

Nada ProfundidadRec(nodo: nodo inicial)


i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=1
i=9 i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=1
i=9
{
Num i; nodo * * nodo

Visitado[nodo] = VERDADERO;
ESCRIBIR(nodo); i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=1
i=9 i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=1
i=9

i = 1; nodo * * * nodo

nodo i=1
i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=9
MIENTRAS (i ≤ n) HACER
i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=1
i=9
SI (M[nodo][i] ≠ 0) ENTONCES {
SI (Visitado[i] == FALSO) ENTONCES nodo * i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=1
i=9 nodo *
ProfundidadRec(i);

i = i + 1;
}
* nodo
}
6 5 2 1 3 4 7 8 i=8
i=7
i=6
i=5
i=4
i=3
i=2
i=1
i=9

Visitados = V
F V
F V
F V
F V
F V
F V
F V
F
1 2 3 4 5 6 7 8

74
Grafos – Recorrido en Profundidad
3. Recorridos en Grafos. Recorrido en Profundidad: A continuación se presenta la versión iterativa del
recorrido en Profundidad: En este caso se utiliza una Pila que “simula” el comportamiento recursivo.
M: Matriz de Adyacencia orden n.
v0: Nodo inicial en el recorrido.

Nada ProfundidadIter(Num M[n][n], Num v0)


{
Pila P;
BOOL Visitado[n]; //Todas las celdas inicializadas en FALSO (“sin visitar”)

Num i, nodo;
P = Push(v0, P);

MIENTRAS (P ≠ VACÍO) HACER {


nodo = Pop(P);
SI NO(Visitado[nodo]) ENTONCES
{
Visitado[nodo] = VERDADERO;
ESCRIBIR(nodo);
i = n;
MIENTRAS (i ≥ 1) HACER {
SI (M[nodo][i] ≠ 0) Y (Visitado[i] == FALSO) Y (Está?(i, P) == FALSO) ENTONCES
P = Push(i, P);
i = i - 1;
}
}
}
}

75
Grafos – Recorrido en Amplitud
4. Recorridos en Grafos. Recorrido en Amplitud: Consiste en visitar un nodo, marcarlo como visitado y
luego visitar todos sus nodos y así sucesivamente con todos los vértices del grafo.
M: Matriz de Adyacencia orden n.
v0: Nodo inicial en el recorrido.

Nada Amplitud(Num M[n][n], Num v0)


{
Fila F;
BOOL Visitado[n]; //Todas las celdas inicializadas en FALSO (“sin visitar”)

Num i, nodo;
F = IngresaFila(v0, F);

MIENTRAS (F ≠ VACÍO) HACER {


nodo = EliminaFila(F);
SI (Visitado[nodo] == FALSO) ENTONCES
{
Visitado[nodo] = VERDADERO;
ESCRIBIR(nodo);
i = 1;
MIENTRAS (i  n) HACER {
SI (M[nodo][i] ≠ 0) Y (Visitado[i] == FALSO) Y (Está?(i, F) == FALSO) ENTONCES
F = IngresaFila(i, F);
i = i + 1;
}
}
}
}

76
Grafos – Recorrido en Amplitud
Ejemplo. Realice un recorrido en amplitud para el siguiente grafo, partiendo desde v0 = 6:

M: Matriz de Adyacencia orden n.


v0: Nodo inicial en el recorrido. nodo
* * nodo
Nada Amplitud(Num M[n][n], Num v0)
{
Fila F=NULL;
BOOL Visitado[n];
Num i, nodo; nodo * * nodo v0 *
nodo
F = IngresaFila(v0, F);
MIENTRAS (F ≠ VACÍO) HACER {
nodo = EliminaFila(F); * *
SI (Visitado[nodo] == FALSO) ENTONCES nodo
{ nodo
Visitado[nodo] = VERDADERO;
ESCRIBIR(nodo);
i = 1; * nodo
MIENTRAS i ≤ n HACER
{
SI (M[nodo][i] ≠ 0) Y (Visitado[i]==FALSO) Y (Esta?(i, F)==FALSO) ENTONCES
F = IngresaFila(i, F);
i = i + 1;
}
}
FFF
F 6 5 7 2 8 1 4 3
} FF
}
24
8
513
76 417832 4

77
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
Flujo Máximo en Redes:

- En los problemas de Flujo en Redes, las aristas representan canales por los que puede circular algo:
datos, agua, autos, pasajeros, corriente eléctrica, etc.

- Los pesos o costos de las aristas representan la capacidad máxima de un canal: velocidad de una
conexión, volumen máximo de agua, cantidad máxima de tráfico, capacidad de pasajeros de los aviones,
voltaje de una línea eléctrica, etc.

- De esta forma, El problema del Flujo Máximo en Redes consiste en encontrar la cantidad máxima de
flujo que puede circular en la red.

- Formalmente, una Red de Flujo es un grafo dirigido, donde el valor asociado a sus arcos corresponde a
la capacidad que posee cada arco.

- Además, este grafo dirigido posee un nodo fuente (normalmente llamado s), del que sólo salen arcos y
un nodo sumidero (normalmente llamado t) que solo recibe arcos.

- En este tipo de grafos el flujo se “inyecta” a la red a partir del nodo fuente, circulando por los arcos
según su sentido y capacidad, hasta el nodo sumidero.

- Entonces, el problema de Flujo Máximo en Redes, consiste en buscar el flujo máximo que se puede
inyectar en una Red de Flujos.

78
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 0 1 2 8 6 4

10 10
2 9 3

4
0 5
Camino simple (s→t): <1, 0, 5, 4>
“Camino de Aumento”
1 2 8 6 4 Costo menor de los arcos del camino: 4
“Flujo de Aumento”
10 10
2 9
3

79
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 4 1 2 8 6 4

10 10
2 9 3

4 (4)
0 5
Camino simple (s→t): <1, 0, 5, 4>
“Camino de Aumento”
1 2 8 6 4 Costo menor de los arcos del camino: 4
“Flujo de Aumento”
10 10
2 9
3

4
0 5

1 2 8 6 4

10 10
2 9
3

80
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 4 1 2 8 6 4

10 10
2 9 3

4 (4)
0 5

1 2 8 6 4

10 10
2 9
3

4
0 5 Camino simple (s→t): <1, 0, 3, 4>
“Camino de Aumento”
1 2 8 6 4 Costo menor de los arcos del camino: 6
“Flujo de Aumento”
10 10
2 9
3

81
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 10 1 2 8 6 4

10 10
2 9 3

4 (4)
0 5

1 2 8 6 4

10 10
2 9
3

4
0 5 Camino simple (s→t): <1, 0, 3, 4>
“Camino de Aumento”
1 2 6 4 Costo menor de los arcos del camino: 6
“Flujo de Aumento”
10
2 9
3

4
0 5

1 2 6 4

10
2 9
3
82
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 10 1 2 8 6 4

10 10
2 9 3

4 (4)
0 5

1 2 8 6 4

10 10
2 9
3

4
0 5

1 2 6 4

10
2 9
3

4
0 5 Camino simple (s→t): <1, 2, 3, 4>
“Camino de Aumento”
1 2 6 4 Costo menor de los arcos del camino: 4
“Flujo de Aumento”
10
2 9
3
83
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 14 1 2 8 6 4

10 10
2 9 3

4 (4) 4
0 5 0 5

1 2 8 6 4 1 2 6 4

10 10
2 3 2 5 3
9
4

4
0 5

1 2 6 4

10
2 9
3

4
0 5 Camino simple (s→t): <1, 2, 3, 4>
“Camino de Aumento”
1 2 6 4 Costo menor de los arcos del camino: 4
“Flujo de Aumento”

2 9 (4)
3
84
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 14 1 2 8 6 4

10 10
2 9 3

4 (4) 4 Camino simple (s→t):


0 5 0 5
“Camino de Aumento”
<1, 2, 3, 5, 4>
1 2 8 6 4 1 2 6 4
Costo menor de los
10 10 arcos del camino: 5
2 3 2 5 3
9
4 “Flujo de Aumento”

4
0 5

1 2 6 4

10
2 9
3

4
0 5

1 2 6 4

2 9 (4)
3
85
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 19 1 2 8 6 4

10 10
2 9 3

4 (4) 4 Camino simple (s→t):


0 5 0 5
“Camino de Aumento”
<1, 2, 3, 5, 4>
2 6

6 (5)
1 8 4 1 2 4
Costo menor de los
10 10 5 (5) arcos del camino: 5
2 9
3 2 3
4 “Flujo de Aumento”

4 4
0 5 0 5

1 2 6 4 1 2 5 1 4

10
2 9
3 2 9 3

4
0 5

1 2 6 4

2 9 (4)
3
86
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
4
10
0 5 10

Flujo que se inyecta a la Red: 19 1 2 8 6 4

10 10
2 9 3

4 (4) 4
0 5 0 5

2 6

6 (5)
1 8 4 1 2 4

10 10 5 (5)
2 9
3 2 3
4

4 4
0 5 0 5 Camino simple (s→t):
“Camino de Aumento”
1 2 6 4 1 2 4 NO EXISTE
5 1

10
2 9
3 2 9 3

4
0 5

1 2 6 4

2 9 (4)
3
87
Grafos – Flujo Máximo en Redes (Ford-Fullkerson)
Red: Matriz de Costos del grafo dirigido que representa a la red de flujo.
s: Nodo fuente de la red.
t: Nodo sumidero de la red.

Num Ford-Fulkerson(Num Red[n][n], Num s, Num t)


{
Num RedResidual[n][n], Camino[n];
Num FlujoAcumulado=0, FlujoAumento, i, numNodos, ini, fin;

RedResidual = Red;

MIENTRAS (¿Existe camino simple desde s hasta t en la RedResidual?) HACER


{
Camino = GeneraUnCamino(s, t, RedResidual);
FlujoAumento = MinimoCostoArco(Camino);
i=1;
numNodos = NumeroNodosDelCamino(Camino);
MIENTRAS (numNodos) HACER
{
ini = Camino[i];
fin = Camino[i+1];
RedResidual[ini][fin] = RedResidual[ini][fin] - FlujoAumento;
RedResidual[fin][ini] = RedResidual[fin][ini] + FlujoAumento;
i = i+1;
}
FlujoAcumulado = FlujoAcumulado + FlujoAumento;
}
RETORNAR FlujoAcumulado;
} 88
TIPOS DE GRAFOS
Grafos
Tipos de grafos:

▪ Multigrafo: Grafo con más de dos aristas con el mismo sentido entre los mismos vértices.

▪ Grafo Simple: Grafo sin lazos ni aristas múltiples.

1 1
10 3
6
2 3 4 2 3 4
2
5 7
5 5

90
Grafos
Tipos de grafos:

▪ Grafo completo: Grafo no dirigido en el que todos sus nodos son adyacentes entre sí. Cada nodo posee
n-1 aristas.

Grafo Completo Grafo Completo Grafo Completo Grafo Completo Grafo Completo
de orden 1 de orden 2 de orden 3 de orden 4 de orden 5

Nota 1: Un Grafo Completo con n nodos posee este número de arcos es:
n·(n − 1)
m=
2

Nota 2: La matriz de adyacencia de un grafo completo posee solo unos (fuera de la diag. ppal).

Nota 3: El orden de un grafo se refiere siempre al número de nodos del grafo, o sea al valor de n.

91
Grafos
Tipos de grafos:

▪ Grafo Conexo: Grafo no dirigido en donde existe un camino que une cualquier par de nodos.

1 1
10 3
6
2 3 4 2 3 4
2
5 7
5 5

NOTA: Para la definición en un grafo dirigido, se suele considerar como un grafo donde existe una cadena
que une cualquier par de nodos.

2 3 4

92
Grafos
Tipos de grafos:
▪ Grafo Desconexo: Grafo que posee al menos un par de vértices entre los que no existe un camino que los
una.

▪ Componentes Conexas: Cada uno de los subgrafos conexos que lo componen.

1 1 1 1
10 3 10
6 6
4 4 7 4 4
2 3 2 3 2 3 2 3
2 2
5 5 1
7
7
5 5 5 5

6
7 7 7
10
8 7 6 1
8 6 7
2 6 6
9

V = {1,2,3,4,5,6,7,8,9}
A ={(1,2), (1,3), (2,3), (1,4), (3,5), (4,5), (6,7), (6,8)}
Este es UN SOLO grafo. 93
Grafos
Tipos de grafos:
▪ Grafo Acíclico: Grafo que no posee ciclos (considerando a lo menos 3 nodos para los ciclos).

▪ Árbol: Grafo Conexo Acíclico (Si posee n nodos, entonces siempre tendrá n-1 arcos).

▪ Grafo Complemento: G1(V, A1) es el grafo complemento de G2(V, A2) sí y sólo sí se puede generar G3(V,
A3), que sea un grafo completo, al considerar: A3 = A1  A2 y A1  A2 = 

G1(V, A1) G2(V, A2) G3(V, A3) 1


1 1

2 3 4 2 3 4 2 3 4

5 5 5
94
Grafos
Tipos de grafos:
▪ Grafos k-regular: Grafo no dirigido donde todos los nodos son de grado k.

k=0 k=1 k=2 k=2

▪ Clique: Subgrafo completo de un grafo. Debe ser de, a lo menos, orden 3.

Clique de orden 3: {1, 2, 5} Clique de orden 4: {3, 4, 5, 6}


Clique de orden 6: {A, G, H, J, K, M}
Clique de orden 4: {D, E, F, L}

NOTA: Aunque las cliques también son grafos, no se mencionan sus arcos pues por definición, posee todos
los arcos. 95
Grafos
Tipos de grafos:
▪ Conjunto Independiente: Subgrafo totalmente desconexo. Es decir A = .

C.I. de orden 3: {nodos verdes}


C.I. de orden 3: {nodos azules} C.I. de orden 9: {nodos azules}
C.I.de orden 4: {nodos rojos}

NOTA: Aunque los conjuntos independientes también son grafos, no se mencionan sus arcos pues por
definición, no posee ninguno.
96
OTRAS REPRESENTACIONES COMPUTACIONALES
Grafos
Representación Computacional:

▪ Matriz de Incidencias: Matriz de orden nm (n número de nodos, m el número de aristas).


• Grafos no dirigidos: habrá un 1 en la posición [i, j], si i es un nodo asociado al arco j.

(1,2) (1,3) (1,4) (2,3) (3,5) (4,5)


1 1 1 1 1 0 0 0
Grafo No Dirigido G (V, A) con: 2 1 0 0 1 0 0
V = {1, 2, 3, 4, 5} 3 0 1 0 1 1 0
2 3 4 A = {(1,2), (1,3), (2,3), (1,4), (3,5), (4,5)} 4 0 0 1 0 0 1
5 0 0 0 0 1 1
5

• Grafos dirigidos: En la posición [i, j], se encontrará un 1 si desde el vértice 𝒊 nace el arco 𝒋; un -1 si hasta el vértice 𝒊 llega
el arco 𝒋.

(1,2) (1,3) (2,3) (3,4) (3,5) (4,5) (5,4)


1
Grafo Dirigido G (V, A ) con: 1 1 1 0 0 0 0 0
V = {1, 2, 3, 4, 5} 2 -1 0 1 0 0 0 0
2 3 4 A = {(1,2), (1,3), (2,3), (3,4), (3,5), (4,5), (5,4)} 3 0 -1 -1 1 1 0 0
4 0 0 0 -1 0 1 -1
5 0 0 0 0 -1 -1 1
5
98
Grafos
Representación Computacional:

▪ Listas de Adyacencia: Son n listas enlazadas, una por cada vértice en V del grafo.

• Grafos no dirigidos: Los nodos en la lista i, corresponden a los nodos adyacentes del nodo i.

2 3 4

• Grafos dirigidos: Los nodos en la lista i, corresponden a los nodos sucesores del nodo i.

2 3 4

99
Grafos
Representación Computacional:

▪ Listas de Incidencias: Son n listas enlazadas, una por cada vértice en V del grafo.

• Grafos no dirigidos: Los nodos en la lista i, almacenan los arcos que inciden en el nodo i.

1 (1,2) (1,3) (1,4)


1
2 (2,1) (2,3)

2 3 4 3 (3,1) (3,2) (3,5)

4 (4,1) (4,5)
5 5 (5,3) (5,4)

• Grafos dirigidos: Los nodos en la lista i, almacenan los arcos que nacen del nodo i.

1 (1,2) (1,3)
1
2 (2,3)

2 3 4 3 (3,4) (3,5)

4 (4,5)

5 5 (5,4)

100
Grafos

Complejidad de Operaciones según la representación computacional utilizada:

Considera que 𝒏 es la cantidad de nodos, y que 𝒎 es la cantidad de aristas.

Listas Matrices
Adyacencia Incidencia Adyacencia Incidencia
Almacenamiento 𝛰 𝑛+𝑚 𝛰 𝑛+𝑚 𝛰 𝑛2 𝛰 𝑛∙𝑚
Agregar Vértice 𝛰 𝑛 𝛰 𝑛 𝛰 𝑛2 𝛰 𝑛∙𝑚
Agregar Arista 𝛰 1 𝛰 1 𝛰 1 𝛰 𝑛∙𝑚
Remover Vértice 𝛰 𝑛+𝑚 𝛰 𝑛+𝑚 𝛰 𝑛2 𝛰 𝑛∙𝑚
Remover Arista 𝛰 𝑛 𝛰 𝑛 𝛰 1 𝛰 𝑛∙𝑚

101
APUNTE Nº6
TIPOS DE DATOS ABSTRACTOS NO LINEALES:
GRAFOS
Algoritmos y Estructuras de Datos

Irene Zuccar Parrini


2022

También podría gustarte