Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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)
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
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
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