Está en la página 1de 59

GRAFOS

Grafo Dirigido
Un directed graph o digraph G es un par (V,E) en donde

V es un conjunto finito de vertices (estados) y E es una relacin binaria que representa las relaciones entre estado y estado (arcos)

Se le llama grafo dirigido porque cada arco tiene una direccin.

Grafo Dirigido
1 G 4 5 6 2 3

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

Grafo no-dirigido
Un grafo no dirigido se define de la misma manera que un grafo dirigido, la nica diferencia es los arcos no tiene direccin, funcionan como arcos de doble direccin. La relacin binaria E que lo representa es simtrica.

Grafo no-dirigido
1 2 3

G
4 5 6

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

Paths
A

Length = 3

Representacin de un Grafo
Existen dos maneras conocidas para representar un grafo

Una coleccin de listas de adyacencia


Representada con un arreglo de listas encadenadas con length igual al nmero de estados

Una matriz de adyacencia


Con casillas que representan las relaciones de todos los estados con todos los estados.

Ejemplo Grafo dirigido


1 2 3

1 1 2 3 2 5 5 2 4 4 1 2 3 4 5 6 0

2 1

3 0

4 1

5 0

6 0

0
0 0 0 0

0
0 1 0 0

0
0 0 0 0

0
0 0 1 0

1
1 0 0 0

0
1 0 0 0

4
5 6

Ejemplo Grafo no dirigido


1
2 3

1 1 2

2 1

3 0

4 1

5 0

2 1
2 1 4

4 4 5 2 2 5 3 5 3

1 2 3 4 5

1
0 1 0

0
1 1 1

1
0 0 1

1
0 0 1

1
1 1 0

3
4 5

Weighted Graphs
Es la misma definicin, solo que cada arco tiene asociado a el un peso.
1
3 4 5 1 2 2 1

3
3

Breadth-first search
Breadth-first search es uno de los dos algoritmos de bsqueda que veremos en clase Teniendo un vertice inicial s, breadth-first search descubre todos los vertices que pueden ser alcanzados desde s, y calcula la distancia que existe hacia ellos

Breadth-first search
El algoritmo descubre todos los vrtices a una distancia k de s, antes de descubrir cualquier vrtice a una distancia k + 1 de s. Para ir mantener la informacin del proceso, el algoritmo colorea cada nodo blanco, gris o negro. Blanco vertice no descubierto Gris vertice descubierto Negro vertice descubierto, todos los vertices adyacentes tambin descubiertos

BFS(G,s) { for each vertex u V[G] {s} { color[u] = WHITE, d[u] = , [u] = null } color[s] = GRAY , d[s] = 0, [u] = null, Q = Q.enqueue(s) while (Q != ) { u = Q.dequeue() for each v Adj[u] { if color[v] = WHITE { color[v] = GRAY d[v] = d[u] + 1 [v] = u Q.enqueue(v) } } color[u] = BLACK } }

Ejemplo
A C E G

Inicial = C

Ejemplo
A C E G
A

B
C

B Inicial = C

D
E

F
G

Ejemplo
A C 0 E G
A

B
C

B Inicial = C

D
E

F
G

Q=

Ejemplo
A C 0 E G
A

B
C

B Inicial = C

D
E

F
G

Q= C

Ejemplo
A C 0 E G
A

B
C

B Inicial = C

D
E

F
G

Q= U=C

Ejemplo
A 1 C 0 E G
A

B
C

B Inicial = C

D
E

F
G

Q= A U=C

Ejemplo
A 1 C 0 E G
A

B
C

B Inicial = C

1 D

D
E

F
G

Q= A D U=C

Ejemplo
A 1 C 0 E G
A

B
C

B Inicial = C

1 D

D
E

F
G

Q= A D U=C

Ejemplo
A 1 C 0 E G
A

B
C

B Inicial = C

1 D

D
E

F
G

Q= D U=A

Ejemplo
A 1 C 0 E G
A

B
C

2 B Inicial = C

1 D

D
E

F
G

Q= D B U=A

Ejemplo
A 1 C 0 E G
A

B
C

2 B Inicial = C

1 D

D
E

F
G

Q= D B U=A

Ejemplo
A 1 C 0 E G
A

B
C

2 B Inicial = C

1 D

D
E

F
G

Q= B U=D

Ejemplo
A 1 C 0 E 2 G
A

B
C

2 B Inicial = C

1 D

D
E

C
D

F
G

Q= B E U=D

Ejemplo
A 1 C 0 E 2 G
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

Q= B E F U=D

Ejemplo
A 1 C 0 E 2 G
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

Q= B E F U=D

Ejemplo
A 1 C 0 E 2 G
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

Q= E F U=B

Ejemplo
A 1 C 0 E 2 G
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

Q= E F U=B

Ejemplo
A 1 C 0 E 2 G
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

Q= F U=E

Ejemplo
A 1 C 0 E 2 G
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

Q= F U=E

Ejemplo
A 1 C 0 E 2 G 3
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

D
E

Q= F U=E

Ejemplo
A 1 C 0 E 2 G 3
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

D
E

Q= F U=E

Ejemplo
A 1 C 0 E 2 G 3
A

B
C

2 B Inicial = C

1 D

2 F

D
E

C
D

F
G

D
E

Q= G U=F

Ejemplo
A 1 C 0 E 2 G 3
A

B
C

C
D

2 B Inicial = C

1 D

2 F

3
E

H
F
G

D
E

Q= G H U=F

Ejemplo
A 1 C 0 E 2 G 3
A

B
C

C
D

2 B Inicial = C

1 D

2 F

3
E

H
F
G

D
E

Q= G H U=F

Ejemplo
A 1 C 0 E 2 G 3
A

B
C

C
D

2 B Inicial = C

1 D

2 F

3
E

H
F
G

D
E

Q= H U=G

Ejemplo
A 1 C 0 E 2 G 3
A

B
C

C
D

2 B Inicial = C

1 D

2 F

3
E

H
F
G

D
E

Q= U=H

Breadth-first tree

A
B C D E F G H

C
A C D D E F

C A B E D F

Depth-first search
Este algoritmo recorre TODO el grafo. Utiliza la misma tcnica que breadth-first search coloreando los estados. No guarda distancias entre nodos (ya que recorre todos los nodos)

DFS() {
for each vertex u V[G] { color[u] = WHITE

[u] = null
} time = 0 for each vertex u V[G] { if color[u] = WHITE DFS-Visit(u) } } {

DFS-Visit(u) { color[u] = GRAY time = time + 1 d[u] = time for each v Adj[u] { if color[v] = WHITE { [v] = u DFS-Visit(v) } } color[u] = BLACK f[u] = time = time + 1 }

Ejemplo
A B C

Ejemplo
A B C A

B
C D E D E F F

TIME = 0

Ejemplo
A B C A

1/

B
C D E

TIME = 1

Ejemplo
A B C A A

1/

2/

B
C D E

TIME = 2

Ejemplo
A B C A A B

1/

2/

B
C D

3/ D E F

E F

TIME = 3

Ejemplo
A B C A A E B

1/

2/

B
C D

4/ D

3/ E F

E F

TIME = 4

Ejemplo
A B C A A E B

1/

2/

B
C D

4/5 D

3/ E F

E F

TIME = 5

Ejemplo
A B C A A E B

1/

2/

B
C D

4/5 D

3/6 E F

E F

TIME = 6

Ejemplo
A B C A A E B

1/

2/7

B
C D

4/5 D

3/6 E F

E F

TIME = 7

Ejemplo
A B C A A E B

1/8

2/7

B
C D

4/5 D

3/6 E F

E F

TIME = 8

Ejemplo
A B C A A E B

1/8

2/7

9/

B
C D

4/5 D

3/6 E F

E F

TIME = 9

Ejemplo
A B C A A E B

1/8

2/7

9/

B
C D

4/5 D

3/6 E

10/ F

E F

TIME = 10

Ejemplo
A B C A A E B

1/8

2/7

9/

B
C D

4/5 D

3/6 E

10/11

E F

TIME = 11

Ejemplo
A B C
9/12

A E B

1/8

2/7

B
C D

4/5 D

3/6 E

10/11

E F

TIME = 12

Ejemplo
A B C
9/12

A E B

1/8

2/7

B
C D

4/5 D

3/6 E

10/11

E F

TIME = 12

Ejemplo
A C A A E B

B
B F C D E E F D