134
CURSO DE PROGRAMACIÓN COMPETITIVA URJC - 2018 Sesión 4 (7ª Semana) David Morán ([email protected]) Juan Quintana ([email protected]) Sergio Pérez ([email protected]) Jesús Sánchez-Oro ([email protected]) 1

Sesión 4 (7ª Semana)

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Sesión 4 (7ª Semana)

CURSO DE PROGRAMACIÓN COMPETITIVAURJC - 2018

Sesión 4 (7ª Semana)

David Morán ([email protected]) Juan Quintana ([email protected])Sergio Pérez ([email protected])Jesús Sánchez-Oro ([email protected])

1

Page 2: Sesión 4 (7ª Semana)

Antes de empezar

● Ada-Byron el 8 y 9 de marzo○ No habrá sesión práctica en el sitio○ Será una competición larga desde el

sábado a las 09:00 hasta el viernes siguiente a las 23:55

○ Serán más problemas de lo habitual (¡hay que entrenar mucho!)

2

Page 3: Sesión 4 (7ª Semana)

Contenidos

● Grafos○ Introducción○ Representación○ Recorrido en Anchura y Profundidad (BFS,

DFS)

3

Page 4: Sesión 4 (7ª Semana)

Contenidos

● Grafos○ Componentes Conexas○ Ordenamiento Topológico○ Componentes Fuertemente Conexas

4

Page 5: Sesión 4 (7ª Semana)

Grafos

● ¿Qué es?● Representación

○ Con índicesi. A → B = mat[a][b] = true

○ Con strings (utilizar map)i. A → B = mat[map[A]][map[B]] = true

5

Page 6: Sesión 4 (7ª Semana)

Grafos

● Árboles: representan relaciones jerárquicas ○ Tienen un padre (excepto la raíz)○ Pueden tener hijos

6

A

C

D

B

E

Page 7: Sesión 4 (7ª Semana)

Grafos

● Restricciones jerárquicas:○ No admite ciclos

7

A

C

D

B

E

● C no puede ser padre de su padre (A)

Page 8: Sesión 4 (7ª Semana)

● Grafos: mayor libertad para representar un sistemas y sus relaciones/interacciones

Grafos

8

A

C

D

B

E

Page 9: Sesión 4 (7ª Semana)

● podemos tener ciclos

Grafos

9

A

C

D

B

E

Page 10: Sesión 4 (7ª Semana)

● podemos tener bucles sobre el mismo elemento

Grafos

10

A

C

D

B

E

Page 11: Sesión 4 (7ª Semana)

● podemos tener grupos aislados en un mismo grafo

Grafos

11

A

C

D

B

E

F

B

Page 12: Sesión 4 (7ª Semana)

● o elementos totalmente aislados entre sí

Grafos

12

A

C

D

B

E

F

B

Page 13: Sesión 4 (7ª Semana)

● Definición: G = (V,E)○ Conjunto de vértices:

V={A,B,C,D,E}

○ Conjunto de aristas:

E={(A,B),(A,C),(B,D),(B,E)}

Grafos

13

A

C

EB

D

Page 14: Sesión 4 (7ª Semana)

● Grafo no dirigido G = (V,E)

○ las aristas no tienen dirección

E={(A,B),(A,C),(B,D),(B, E)}

(A,B) ⇔ (B,A)

Grafos

14

A

C

EB

D

Page 15: Sesión 4 (7ª Semana)

● Grafo no dirigido G = (V,E)

○ aristas tienen dirección (orden)

E={(A,B),(A,C),(B,D),(E, B)}

(E,B) ≠ (B,E)

Grafos

15

A

C

EB

D

Page 16: Sesión 4 (7ª Semana)

● Grafo ponderado G = (V,E)

○ las aristas tienen pesos/valoresE={(A,B),(A,C),(B,D),(B, E,)}

○ función de pesos (f)f((A,B)) = 1f((B,D)) = 3 ...

Grafos

16

A

C

EB

D

1 2

1 3

Page 17: Sesión 4 (7ª Semana)

Grafos - Implementación

● Implementaciones○ Matriz de adyacencia○ Lista de adyacencia○ Lista de aristas

17

Page 18: Sesión 4 (7ª Semana)

Grafos - Matriz

● Matriz de adyacencia○ Array de dos dimensiones

18

A

C

B

D

A B C D

A 0 1 1 0

B 1 0 1 1

C 1 1 0 0

D 0 1 0 0

Page 19: Sesión 4 (7ª Semana)

Grafos - Matriz

● Arista (B,C) ⇒ m[1][2] = 1

19

A

C

B

D

A B C D

A 0 1 1 0

B 1 0 1 1

C 1 1 0 0

D 0 1 0 0

Page 20: Sesión 4 (7ª Semana)

Grafos - Matriz

● Matriz simétrica en grafos no dirigidos● m[fila][col]==m[col][fila]

20

A

C

B

D

A B C D

A 0 1 1 0

B 1 0 1 1

C 1 1 0 0

D 0 1 0 0

Page 21: Sesión 4 (7ª Semana)

Grafos - Matriz

● Si el grafo es dirigido...● m[2][1]=1 y =m[1][2]=0

21

A

C

B

D

A B C D

A 0 0 1 0

B 1 0 0 0

C 0 1 0 0

D 0 1 0 0

Page 22: Sesión 4 (7ª Semana)

Grafos - Matriz

● Matriz de adyacencia○ Memoria: O(|V|2)○ Acceso: O(1)○ Aristas de un vértice: O(|V|)

■ hay que recorrer toda la fila (incluso si solo tiene una o ninguna)

● Caso de uso: grafos densos (N~=5000)

22

Page 23: Sesión 4 (7ª Semana)

Grafos - Lista

● Lista de adyacencia○ enumerar las aristas por vértice

23

A

C

B

D

A ⇒ {B,C}

B ⇒ {A,C,D}

C ⇒ {A,B}

D ⇒ {B}

Page 24: Sesión 4 (7ª Semana)

Grafos - Lista

● Lista de adyacencia○ guardar cada lista en un array

24

A

C

B

D

A {B,C}

B {A,C,D}

C {A,B}

D {B}

Page 25: Sesión 4 (7ª Semana)

Grafos - Lista

● Lista de adyacencia○ Memoria: O(|V|+|E|)○ Acceso: O(|V|)

■ recorrer todas las aristas de la lista○ Aristas de un vértice: O(|V|)

■ en el peor caso tiene aristas a todos los vértices

● útil en grafos dispersos

25

Page 26: Sesión 4 (7ª Semana)

Grafos - Lista

● Consultar si existe una arista (pseudocódigo)grafo = vector<int> adyacentes//inicializar el vector / añadir aristasA = 0C = 2adyacentesA = grafo[A]existeAC = grafo[A].contiene(C)

26

Page 27: Sesión 4 (7ª Semana)

Grafos - Mapas

● Permite utilizar cualquier tipo de etiquetas○ no solo indices sino strings u otros

traduccion = mapa<string, int>grafo = vector<int> adyacentesadyacentes = grafo[traduccion[“madrid”]]existeArista = adyacentes.contiene(“murcia”)

27

Page 28: Sesión 4 (7ª Semana)

Grafos - Lista Aristas

● Existe otra implementación para representar un grafo

● Más utilizada para algoritmos específicos● Guardar en una lista las conexiones de A a B● vector<arista> aristas● aristas.insertar(arista(a, b))

28

Page 29: Sesión 4 (7ª Semana)

Grafos - Recorridos

● Recorrer los los vértices de un grafo○ Recorrido en anchura (BFS - Breadth

First Search)○ Recorrido en profundidad (DFS - Depth

First Search)

29

Page 30: Sesión 4 (7ª Semana)

● Recorrer los vértices de un grafo○ Seleccionamos un vértice al azar○ Recorrido BFS o DFS

Grafos - Recorridos

30

A

C

D

B

E

F

B

Page 31: Sesión 4 (7ª Semana)

● Recorrer los vértices de un grafo● Necesitamos llevar cuenta de en qué

nodos hemos estado ya● Ventajas: Si llegamos a un nodo destino,

está garantizado que habremos llegado en la menor cantidad de pasos

● Cada arista recorrida cuenta como 1 paso

Grafos - Recorridos

31

Page 32: Sesión 4 (7ª Semana)

● Recorrer los vértices de un grafo○ No siempre se puede recorrer todo

desde un vértice inicial● Soluciones:

○ Elegir un vértice nuevo (no visitado)○ Ignorar vértices desconectados○ etc (depende del problema)

Grafos - Recorridos

32

Page 33: Sesión 4 (7ª Semana)

Grafos - BFS

● Recorrido en anchura

33

A

C

D

B

E F

G

Page 34: Sesión 4 (7ª Semana)

Grafos - BFS

● Si empezamos desde A● Recorrido por niveles

A

34

A

C

D

B

E F

G

Page 35: Sesión 4 (7ª Semana)

Grafos - BFS

● Si empezamos desde A● Recorrido por niveles

A ⇒ B ⇒ C

35

A

C

D

B

E F

G

Page 36: Sesión 4 (7ª Semana)

Grafos - BFS

● Si empezamos desde A● Recorrido por niveles

A ⇒ B ⇒ C ⇒ D ⇒ E⇒ F ⇒ G

36

A

C

D

B

E F

G

Page 37: Sesión 4 (7ª Semana)

Grafos - BFS

● Si empezamos desde A● Recorrido por niveles

A ⇒ B ⇒ C ⇒ D ⇒ E⇒ F ⇒ G

37

A

C

D

B

E F

G

Page 38: Sesión 4 (7ª Semana)

Grafos - BFS

● Implementación○ Array de valores booleanos (visitados)○ Cola de vértices a explorar

■ Se procesan en orden de llegada

38

Page 39: Sesión 4 (7ª Semana)

Grafos - BFS

● Inicialización: Elegimos un vértice inicial

inicial = 0visitado[inicial]=truecola.add(inicial)

39

A

C

D

B

E F

G

Page 40: Sesión 4 (7ª Semana)

Grafos - BFS

● Cola = {A}

inicial = Avisitado[inicial]=truecola.add(inicial)

40

A

C

D

B

E F

G

Page 41: Sesión 4 (7ª Semana)

Grafos - BFS

● Recorremos los vértices

mientras(cola.size() > 0)v = cola.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truecola.add(ady)

41

A

C

D

B

E F

G

Page 42: Sesión 4 (7ª Semana)

Grafos - BFS

● Cola = {}● Sacamos Amientras(cola.size() > 0)

v = cola.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truecola.add(ady)

42

A

C

D

B

E F

G

Page 43: Sesión 4 (7ª Semana)

Grafos - BFS

● Cola = {B,C}

mientras(cola.size() > 0)v = cola.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truecola.add(ady)

43

A

C

D

B

E F

G

Page 44: Sesión 4 (7ª Semana)

Grafos - BFS

● Cola = {C}● Sacamos Bmientras(cola.size() > 0)

v = cola.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truecola.add(ady)

44

A

C

D

B

E F

G

Page 45: Sesión 4 (7ª Semana)

Grafos - BFS

● Cola = {C, D, E}●mientras(cola.size() > 0)

v = cola.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truecola.add(ady)

45

A

C

D

B

E F

G

Page 46: Sesión 4 (7ª Semana)

Grafos - BFS

● Cola = {D, E, F}● Sacamos C, Metemos Fmientras(cola.size() > 0)

v = cola.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truecola.add(ady)

46

A

C

D

B

E F

G

Page 47: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorrido en profundidad● Equivalente a recorrer ramas

47

A

C

D

B

E F

G

Page 48: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorrido en profundidad● Seleccionamos A

48

A

C

D

B

E F

G

Page 49: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorrido en profundidad● Seleccionamos A

○ Recorremos una ramahasta el final

49

A

C

D

B

E F

G

Page 50: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorrido en profundidad● volvemos al siguiente vértice

con adyacentes (B)

50

A

C

D

B

E F

G

Page 51: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorrido en profundidad● volvemos al siguiente vértice

con adyacentes (B)○ recorremos la nuevarama hasta el final

51

A

C

D

B

E F

G

Page 52: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorrido en profundidad● volvemos al siguiente vértice

con adyacentes (A)

52

A

C

D

B

E F

G

Page 53: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorrido en profundidad● volvemos al siguiente vértice

con adyacentes (A)

53

A

C

D

B

E F

G

Page 54: Sesión 4 (7ª Semana)

Grafos - DFS

● Implementación○ Array de valores booleanos (visitados)○ Pila de vértices a explorar

■ Se procesa el más reciente primero■ Acumulamos los más antiguos para el

final

54

Page 55: Sesión 4 (7ª Semana)

Grafos - DFS

● Inicialización: Elegimos un vértice inicial

inicial = Avisitado[inicial]=truepila.add(inicial)

55

A

C

D

B

E F

G

Page 56: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {A} ⇐ cima de la pila por la derecha

inicial = Avisitado[inicial]=truepila.add(inicial)

56

A

C

D

B

E F

G

Page 57: Sesión 4 (7ª Semana)

Grafos - DFS

● Recorremos los vértices

mientras(pila.size() > 0)v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

57

A

C

D

B

E F

G

Page 58: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {}● Sacamos Amientras(pila.size() > 0)

v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

58

A

C

D

B

E F

G

Page 59: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {B,C}

mientras(pila.size() > 0)v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

59

A

C

D

B

E F

G

Page 60: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {B}● Sacar Cmientras(pila.size() > 0)

v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

60

A

C

D

B

E F

G

Page 61: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {B,F}

mientras(pila.size() > 0)v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

61

A

C

D

B

E F

G

Page 62: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {B}● Sacar Fmientras(pila.size() > 0)

v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

62

A

C

D

B

E F

G

Page 63: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {D,E}● Sacar B, Meter D,Emientras(pila.size() > 0)

v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

63

A

C

D

B

E F

G

Page 64: Sesión 4 (7ª Semana)

Grafos - DFS

● Pila = {D, G}● Sacar E, Meter Gmientras(pila.size() > 0)

v = pila.extraer()para cada ady de v:

if(no visitado[ady])visitado[ady]=truepila.add(ady)

64

A

C

D

B

E F

G

Page 65: Sesión 4 (7ª Semana)

Grafos - DFS

● También se puede utilizar la pila de sistema (recursión) para recorrer el grafo

DFS(v) visitado[v] = true para cada ady de v: si (no visitado[ady]) DFS(ady)

65

Page 66: Sesión 4 (7ª Semana)

Grafos - Eulerianos

● Camino euleriano○ ¿Se puede recorrer un grafo de manera

que solo se recorra cada una de sus aristas solo una vez?

66

Page 67: Sesión 4 (7ª Semana)

Grafos - Eulerianos

● Camino euleriano○ Sea C(v) el número de aristas que tiene el

vértice v○ Es camino euleriano si todos los vértices

cumplen que C(v) es par○ Ó si C(v) es impar en solo 2 vértices

67

Page 68: Sesión 4 (7ª Semana)

Grafos - Eulerianos

68

0 2

31

Page 69: Sesión 4 (7ª Semana)

Grafos - Eulerianos

69

0 2

31

3 -> 22 -> 11 -> 00 -> 2

Page 70: Sesión 4 (7ª Semana)

Grafos - Eulerianos

● Ciclo euleriano○ ¿Se puede recorrer un grafo de manera

que solo se recorra cada una de sus aristas solo una vez y llegar al mismo punto de inicio?

70

Page 71: Sesión 4 (7ª Semana)

Grafos - Eulerianos

● Camino euleriano○ Sea C(v) el número de aristas que tiene el

vértice v○ Es camino euleriano si todos los vértices

cumplen que C(v) es par

71

Page 72: Sesión 4 (7ª Semana)

Grafos - Eulerianos

72

0

2

31

4

Page 73: Sesión 4 (7ª Semana)

Grafos - Eulerianos

73

0

2

31

4

0 -> 11 -> 22 -> 33 -> 44 -> 11 -> 33 -> 00 -> 22 -> 44 -> 0

Page 74: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

● Recorriendo solo una vez todos los nodos del grafo○ (Camino) Recorrer todos los nodos del

grafo○ (Ciclo) Recorrer todos los nodos del grafo

y llegar al mismo punto de inicio

74

Page 75: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

● Camino/Ciclo euleriano es trivial● Hamiltoniano es un algoritmo NP-Completo● Noción de máscara de bits

○ Un entero puede ser representado por hasta 32 bits

○ Utilizar el mismo principio para saber qué nodo hemos visitado

75

Page 76: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

● Si tuviésemos 3 nodos y estuviésemos interesados en chequear un ciclo hamiltoniano tendríamos que usar el entero 7 (2³-1), cuya representación de bits es 111

● Por cada nodo que visitemos lo marcamos a 0○ mask = 7 // 111○ mask ^ (1<<i) donde i es el nodo

76

Page 77: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

● Recordemos la tabla de verdad de XOR○ 1 XOR 1 = 0○ 0 XOR 1 = 1○ 1 XOR 0 = 1○ 0 XOR 0 = 0

77

Page 78: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

● Si queremos saber si el i-ésimo bit está encendido:○ mask & (1<<i)

i. Desplazamos 1 i veces a la izquierdaii. Para i=2; 100 (4)iii. 7 & 4 = 111 & 100 => (4)iv. Mientras que mask & (1<<i) no tome un

valor de 0, el i-ésimo bit está encendido

78

Page 79: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

● Si queremos convertir el i-ésimo bit a 0 (sabiendo que está encendido de antes):○ mask ^ (1<<i)

i. Desplazamos 1 i veces a la izquierdaii. Para i=2; 100 (4)iii. 7 ^ 4 = 111 ^ 100 => (011)

79

Page 80: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

● En caso del camino hamiltoniano si mask=0 hemos terminado

● En caso de ciclo si mask=0 tenemos que comprobar que el nodo actual es igual al nodo de inicio

80

Page 81: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

81

Page 82: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

82

0 1

2

NODO=0,MASK=1112

Page 83: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

83

0 1

2

NODO=0,MASK=1112

2⁰ = 1111 & 001 > 0?

Page 84: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

84

0 1

2

NODO=2,MASK=1102

2² = 4 (100)110 & 100 > 0?

Page 85: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

85

0 1

2

NODO=1,MASK=0102

2¹ = 2 (010)010 & 010 > 0?

Page 86: Sesión 4 (7ª Semana)

Grafos | Camino y ciclo Hamiltoniano

86

0 1

2

NODO=X,MASK=0002

Es camino Hamiltoniano

¿Es también ciclo?

Page 87: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

● Es un subgrafo donde dos vértices cualesquiera están conectados a través de uno o más caminos

● Se parte de un grafo no dirigido

87

Page 88: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

● La idea básica es hacer un BFS/DFS por cada vértice i desde 0..N siempre y cuando i no haya sido recorrido por un algoritmo anterior

● Se cuenta 1 y se recorre i

88

Page 89: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

89

Page 90: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

90

+1 Componente Conexa (1)

Page 91: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

91

Page 92: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

92

Page 93: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

93

Page 94: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

94

Page 95: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

95

+1 Componente Conexa (2)

Page 96: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

96

Page 97: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

97

Page 98: Sesión 4 (7ª Semana)

Grafos | Componentes Conexas

● Se empieza desde 0 y se recorre:○ 0-2-5-3

● Al estar 1 no visitado se recorre los adyacentes de 1○ 1-4

● Al estar 2,3,4,5 no visitado se ignoran● Hay dos componentes conexas

98

Page 99: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

● Sobre un grafo acíclico dirigido (DAG)● Ordenar nodos tal que para cualquier nodo

u,v; al momento de eliminar u, v no contenga aristas hacia ella

● Utilizar el algoritmo de DFS

99

Page 100: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

100

Page 101: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

101

A

B

C

D

A y C no les incide ningún otro nodo

Page 102: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

102

A

B

C

D

DFS(A) = DFS(B), DFS(D)

TS = { }

Page 103: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

103

A

B

C

D

DFS(B) = DFS(D)

TS = { }

Page 104: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

104

A

B

C

D

DFS(D) = ø, TS.push(D)

TS = {D}

Page 105: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

105

A

B

C

D

DFS(B) = DFS(D), TS.push(B)

TS = { B, D}

Page 106: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

106

A

B

C

D

DFS(A) = DFS(B), DFS(D), TS.push(A)

TS = { A, B, D}

Page 107: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

107

A

B

C

D

DFS(C) = DFS(D), TS.push(C)

TS = { C, A, B, D}

Page 108: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

108

A

B

C

D

A y C pueden ir en cualquier orden, por lo que los toposort son => {C,A,B,D} ó {A,C,B,D}

TS = { C, A, B, D}

Page 109: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

● PseudocódigoTopoSort(n): si v(n) ret ø v(n) = 1 for edge in edges(n): TopoSort(edge) TS.push(n) ret ø

109

Page 110: Sesión 4 (7ª Semana)

Grafos | Ordenamiento Topológico

● Pseudocódigo● Siendo TS una pila● Siendo edges(N) una lista de vértices que

inciden en el nodo N● Siendo V(N) un array de booleanos donde se

entiende que si V(N) = 1 ya ha pasado un recorrido en profundidad por el nodo N

110

Page 111: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

● Para cada par de nodos u,v en un grafo dirigido

● Se puede llegar desde u, v a través de 0 o más nodos intermedios

● Algoritmo de Kosaraju

111

Page 112: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

● Algoritmo de Kosaraju○ Llevar una transposición del grafo (grafo

invertido)○ Realizar un ordenamiento topológico del

grafo dirigido en cuestión○ Desapilar el i-ésimo nodo de la pila y

realizar un DFS desde ese nodo hacia todos los demás en el grafo invertido

112

Page 113: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

● Algoritmo de Kosaraju○ Si ya ha sido visitado el j-ésimo nodo del

grafo revertido, no tomarlo en cuenta○ Finalmente, contar 1 por cada vez que se

realice un DFS

113

Page 114: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

114

Page 115: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

115

1 0

2

3

4

TS = { }

DFS(0) => DFS(2), DFS(3)

Page 116: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

116

1 0

2

3

4

TS = { }

DFS(2) => DFS(1)

Page 117: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

117

1 0

2

3

4

TS = { 1 }

DFS(1) => DFS(0), TS.push(1)

Page 118: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

118

1 0

2

3

4

TS = { 2, 1}

DFS(2) => DFS(1), TS.push(2)

Page 119: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

119

1 0

2

3

4

TS = { 2, 1}

DFS(0) => DFS(2), DFS(3)

Page 120: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

120

1 0

2

3

4

TS = { 2, 1}

DFS(3) => DFS(4)

Page 121: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

121

1 0

2

3

4

TS = { 4, 2, 1}

DFS(4) => ø, TS.push(4)

Page 122: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

122

1 0

2

3

4

TS = { 3, 4, 2, 1}

DFS(3) => DFS(4), TS.push(3)

Page 123: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

123

1 0

2

3

4

TS = { 0, 3, 4, 2, 1}

DFS(0) => DFS(2), DFS(3), TS.push(0)

Page 124: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

124

1 0

2

3

4

TS = {0,3,4,2,1}

Invertimos el grafo y seguimos un DFS en el orden del TS

Page 125: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

125

1 0

2

3

4

TS = {0,3,4,2,1}SCC=1

DFS(0), SCC+1

Page 126: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

126

1 0

2

3

4

TS = {0,3,4,2,1}SCC=1

DFS(1)

Page 127: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

127

1 0

2

3

4

TS = {0,3,4,2,1}SCC=1

DFS(2)

Page 128: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

128

1 0

2

3

4

TS = {0,3,4,2,1}SCC=2

3 no está verde, por tanto, DFS(3), SCC+1

Page 129: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

129

1 0

2

3

4

TS = {0,3,4,2,1}SCC=3

4 no está verde, por tanto, DFS(4), SCC+1

Page 130: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

130

1 0

2

3

4

TS = {0,3,4,2,1}SCC=3

1 y 2 están verdes, ya fueron tomados en cuenta, no hace falta visitar, SCC=3

Page 131: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

131

Page 132: Sesión 4 (7ª Semana)

Grafos | Componentes Fuertemente Conexas

● Para el ejemplo○ Desde 0 -> Toposort = [1,2,4,3,0]○ Gr[1] => [1,2,0] (+1)○ Gr[2] => [] (+0)○ Gr[3] => [0(x)] (+1)○ Gr[4] => [3(x)] (+1)

● 3 componentes fuertemente conexas

132

Page 133: Sesión 4 (7ª Semana)

Semana que viene...

● Grafos (parte II)○ Ponderamiento en grafos○ Colas de prioridad○ Algoritmos de distancia mínima (floyd

warshall, dijkstra)○ Estructura Union-Find○ Árboles de recubrimiento (Prim, Kruskal)

133

Page 134: Sesión 4 (7ª Semana)

¡Hasta la próxima semana!

134

Ante cualquier duda sobre el curso o sobre los problemas podéis escribirnos (preferiblemente copia a los tres)

David Morán ([email protected]) Juan Quintana ([email protected])Sergio Pérez ([email protected])Jesús Sánchez-Oro ([email protected])