arboles-091018235654-phpapp01.pdf
TRANSCRIPT
-
7/26/2019 arboles-091018235654-phpapp01.pdf
1/60
Estructuras de Datos y Algoritmos
Facultad de Informatica
Universidad Politecnica de Valencia
Curso 2008/2009
Tema 4:
Grafos y arboles
FI UPV: Curso 2008/2009
-
7/26/2019 arboles-091018235654-phpapp01.pdf
2/60
EDA-4
TEMA 4. Grafos y arboles
Objetivos
Definiciones, representacion y recorrido de arboles y grafos.
Contenidos
1 Grafos: Definiciones basicas2 Representacion de grafos3 Arboles: Definiciones basicas4 Arboles binarios5 Representacion de arboles6 Recorridos de arboles binarios7 Recorrido de grafos8 Orden topologico en grafos acclicos
Bibliografa
Introduction to Algorithms, de Cormen, Leiserson y Rivest (sec. 5.4, 5.5, 11.4 y 23.1) Estructuras de datos y algoritmos, de Aho, Hopcroft y Ullman (captulos 3, 6 y 7)
FI UPV: Curso 2008/2009 Pagina 4.1
-
7/26/2019 arboles-091018235654-phpapp01.pdf
3/60
EDA-4
1. GRAFOS: DEFINICIONES BASICAS
Grafo dirigido: es un par G = (V, A) donde V es un conjunto finito de elementosllamados verticesyA V V es un conjunto de pares ordenados de vertices llamadosaristas.
Si (u, v) es una arista deG, se dice que el vertice v es adyacentea u.
0 1 2
53 4
FI UPV: Curso 2008/2009 Pagina 4.2
-
7/26/2019 arboles-091018235654-phpapp01.pdf
4/60
EDA-4
1. GRAFOS: DEFINICIONES BASICAS
Grafo no dirigido: es un par G = (V, A) donde V es un conjunto finito de vertices yA {{u, v} |u, v V v=u}es un conjunto de pares no ordenados de vertices.
Sia= {u, v}es una arista no dirigida, se dice que aunea uyv y quea incideen uy v.
Si {u, v} es una arista de G, se dice que el vertice v es adyacente a u. La relacion essimetrica.
0 1
4 3
2
FI UPV: Curso 2008/2009 Pagina 4.3
-
7/26/2019 arboles-091018235654-phpapp01.pdf
5/60
EDA-4
1. GRAFOS: DEFINICIONES BASICAS
Grado:para todo vertice v,
grado de entradaes el numero de aristas que inciden env; grado de salida es el numero de aristas que emergen de v; gradoes la suma de los grados de entrada y salida dev.
El grado de un grafo es el maximo grado de sus vertices.
0 1 2
53 4
Ejem.: El grado de entrada del vertice 1 es 2; el grado de salida es 1; el grado del vertice es 3. El grado del
grafo es 3.
FI UPV: Curso 2008/2009 Pagina 4.4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
6/60
EDA-4
1. GRAFOS: DEFINICIONES BASICAS
Camino desde un vertice u V a un vertice v V: es una secuenciav0, v1, . . . , vk devertices de G= (V, A) tal que v0=u, vk =v, (vi, vi+1) A, 0 i < k.La longitud de un camino v0, v1, . . . , vk es el numero de aristas que lo forman.Camino simple: es un camino v0, v1, . . . , vk en el que todos sus vertices son distintos,excepto quizas el primero y el ultimo.Ciclo:es un camino simple v0, v1, . . . , vktal que v0= vk y el camino contiene al menosuna arista.Un bucle es un ciclo de longitud 1.
0 1 2
53 4
Ejem.: El camino0, 3, 1, 4 es simple y tiene longitud 3. El camino 0, 1, 4, 3, 1 no es simple.
Ejem.: El camino1, 4, 3, 1 es un ciclo de longitud 3. El ciclo 5, 5 es un bucle.
Grafo acclico:es un grafo sin ciclos.
FI UPV: Curso 2008/2009 Pagina 4.5
-
7/26/2019 arboles-091018235654-phpapp01.pdf
7/60
EDA-4
1. GRAFOS: DEFINICIONES BASICAS
Subgrafo:G = (V, A) es un subgrafo de G= (V, A) siV V A A.Subgrafo inducido: Dado V V , el subgrafo de G inducido por V es G = (V, A)
tal que A ={(u, v) A | u, v V}.
0 1 2
53 4
0 1
3 4
0 1
3 4
Subgrafo Subgrafo inducido por V ={0, 1, 3, 4}
FI UPV: Curso 2008/2009 Pagina 4.6
-
7/26/2019 arboles-091018235654-phpapp01.pdf
8/60
EDA-4
1. GRAFOS: DEFINICIONES BASICAS
Vertice alcanzable desde un vertice u: es cualquier vertice v para el que existe uncamino de u a v.
Las componentes conexas en un grafo no dirigido son las clases de equivalencia devertices segun la relacion ser alcanzable.
Un grafo no dirigido es conexo siu, v V, v es alcanzable desdeu. Es decir, si tieneuna unica componente conexa.
Las componentes fuertemente conexas en un grafo dirigido son las clases deequivalencia de vertices segun la relacion ser mutuamente alcanzable.
Un grafo dirigido esfuertemente conexo siu, vV, v es alcanzable desdeu.
0 1
4 3
2
0 1 2
53 4
FI UPV: Curso 2008/2009 Pagina 4.7
-
7/26/2019 arboles-091018235654-phpapp01.pdf
9/60
EDA-4
1. GRAFOS: DEFINICIONES BASICAS
Grafo completo:es un grafo G= (V, A) en el que u, v V, u=v, (u, v) A.Grafo etiquetado: es un grafo G = (V, A) acompanado de una funcion f : A E,
donde Ees un conjunto cuyas componentes se denominanetiquetas.Grafo ponderado:es un grafo etiquetado con numeros reales (E R).Un grafo se consideradenso si|A| |V|2.Un grafo se consideradispersosi|A|
-
7/26/2019 arboles-091018235654-phpapp01.pdf
10/60
EDA-4
2. REPRESENTACION DE GRAFOS: Matriz de adyacencias
Un grafo G = (V, A) se representa como G: matriz[V, V] de booleanos. La componenteG[u, v] es 1 si(u, v) A; sinoG[u, v] = 0.
Memoria:O(|V|2) grafos densos|A| |V|2.Tiempo de acceso: O(1). Lista adyacentes:O(|V|). Lista incidentes:O(|V|).
0 1 2
53 4
0
0
0
0
0
0
1 0 1 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
1
0
0
1
2
3
4
5
0 1
4 3
2
1 0 0 1
0
1
1
1
1
0
1
0
1
1
0
1
1
0
1
0
0
1
2
3
4
0
1
0
0
1
FI UPV: Curso 2008/2009 Pagina 4.9
-
7/26/2019 arboles-091018235654-phpapp01.pdf
11/60
EDA-4
1 // Representacion de Grafos: Matriz de adyacencia
2 #include
3 #include
4 using namespace std;
5 class grafoDirigidoBitMat {6 int numVert;
7 vector vec;
8 int indice(int u, int v) const { return u*numVert+v; }
9 public:
10 grafoDirigidoBitMat(int nvert) : numVert(nvert),vec(nvert*nvert) {}
11 void insertar_arista(int u, int v) { vec[indice(u,v)] = true; }
12 bool existe_arista(int u, int v) const { return vec[indice(u,v)]; }13 void imprime(ostream &s) const;
14 };
15 void grafoDirigidoBitMat::imprime(ostream &s) const {
16 for (int u=0; u < numVert; ++u) {
17 for (int v=0; v < numVert; ++v)
18 s
-
7/26/2019 arboles-091018235654-phpapp01.pdf
12/60
EDA-4
22 ostream& operator v ) { // lectura de aristas
33 if (0
-
7/26/2019 arboles-091018235654-phpapp01.pdf
13/60
EDA-4
2. REPRESENTACION DE GRAFOS: Listas de adyacencia
Un grafoG = (V, A)se representa como unvector de listas de verticesindexado por vertices;es decir, G: vector[V] de V . Cada componente G[v] es una lista de los vertices emergentes
y/o incidentes de/a v V.Memoria:O(|V| + |A|) grafos dispersos|A|
-
7/26/2019 arboles-091018235654-phpapp01.pdf
14/60
EDA-4
1 // Representacion de Grafos: Listas de adyacencia
2 #include
3 using namespace std;
4 class grafoListaAd {
5 struct arista {6 int vertice_destino;
7 arista *sig;
8 arista (int v, arista *s) { vertice_destino=v; sig=s; }
9 };
10 int numVert;
11 arista **vec;
12 public:13 grafoListaAd(int numVert);
14 bool existe_arista(int u, int v) const;
15 void insertar_arista(int u, int v, bool nueva=false);
16 void imprime(ostream &s) const;
17 };
18 grafoListaAd::grafoListaAd(int numVert) {
19 this->numVert = numVert;
20 vec = new arista*[numVert];
21 for (int i=0; i < numVert; i++) vec[i] = 0;
22 }
FI UPV: Curso 2008/2009 Pagina 4.13
-
7/26/2019 arboles-091018235654-phpapp01.pdf
15/60
EDA-4
23 bool grafoListaAd::existe_arista(int u, int v) const {
24 for (const arista *r = vec[u]; r != 0; r = r->sig)
25 if (r->vertice_destino == v) return true;
26 return false;
27 }28 void grafoListaAd::insertar_arista(int u, int v, bool nueva) {
29 if (nueva || !existe_arista(u,v))
30 vec[u] = new arista(v,vec[u]);
31 }
32 void grafoListaAd::imprime(ostream &s) const {
33 for (int i=0; i < numVert; i++) {
34 s
-
7/26/2019 arboles-091018235654-phpapp01.pdf
16/60
EDA-4
45 int main(int argc, char *argv[]) {
46 if (argc != 2) {
47 cerr > v ) { // lectura de aristas
53 if (0
-
7/26/2019 arboles-091018235654-phpapp01.pdf
17/60
EDA-4
Resumen: Representacion de grafos
Espacio
Matriz de adyacencia (|V|2)Listas de adyacencia (|V| + |A|)
Construccion del grafo (u, v) AMatriz de adyacencia (|V|2) (1)
Listas de adyacencia (|V| + |A|) (grado salida(u))
Recorrido sucesores Recorrido predecesoresMatriz de adyacencia (|V|) (|V|)Listas de adyacencia (grado salida(u)) (|V| + |A|)Listas de incidencia (|V| + |A|) (grado entrada(u))
FI UPV: Curso 2008/2009 Pagina 4.16
-
7/26/2019 arboles-091018235654-phpapp01.pdf
18/60
EDA-4
Ejercicio: Grafo traspuesto
El grafo traspuesto de un grafo dirigido G = (V, A) es un grafoGt = (V, At)donde(u, v) At si y solo si(v, u) A. Escribe dosalgoritmos que permitan construir el grafo traspuesto Gt a partirde G:
En el primer algoritmo los grafos se representaran mediante
matrices de adyacencia.En el segundo algoritmo los grafos se representaran mediantelistas de adyacencia.
Calcula el coste computacional de los dos algoritmos.
FI UPV: Curso 2008/2009 Pagina 4.17
-
7/26/2019 arboles-091018235654-phpapp01.pdf
19/60
EDA-4
Ejercicio: Grafo traspuesto
Se puede modificar el propio grafo:
1 void grafoDirigidoBitMat::trasponer () { // in place2 for (int u=0; u < vertices; ++u)
3 for (int v=0; v < u; ++v) {
4 bool aux = vec[indice(u,v)];
5 vec[indice(u,v)] = vec[indice(v,u)];
6 vec[indice(v,u)] = aux;
7 }
8 }
Coste: Recorrer la matriz (|V|2)
FI UPV: Curso 2008/2009 Pagina 4.18
-
7/26/2019 arboles-091018235654-phpapp01.pdf
20/60
EDA-4
Ejercicio: Grafo traspuesto
O bien devolver otra instancia de la clase:
1 grafoListaAd* grafoListaAd::trasponer() const { // devuelve OTRO grafo2 grafoListaAd* resul = new grafoListaAd(numVert);
3 for (int u=0; u < numVert; ++u)
4 for (const arista *r = vector[u]; r != 0; r = r->sig) {
5 int v = r->vertice_destino;
6 // le decimos true para no subir el coste innecesariamente:
7 resul->insertar_arista(v,u,true);
8 }9 return resul;
10 }
Coste: Recorrer la matriz (|V| + |A|)
FI UPV: Curso 2008/2009 Pagina 4.19
-
7/26/2019 arboles-091018235654-phpapp01.pdf
21/60
EDA-4
Ejercicio: Cuadrado de un grafo
El cuadrado de un grafo dirigido G = (V, A) se define comoG2 = (V, A) tal que (u, w) A si y solo si para algun v V secumple que (u, v) A y (v, w) A en el grafo G.
Escribe dos algoritmos para calcularG2 a partir deG, suponien-do que este ultimo esta representado como una matriz deadyacencia y como lista de adyacencia.
Calcula el coste temporal de los algoritmos resultantes, justif-icandolo adecuadamente.
FI UPV: Curso 2008/2009 Pagina 4.20
-
7/26/2019 arboles-091018235654-phpapp01.pdf
22/60
EDA-4
Ejercicio: Cuadrado de un grafo
Solucion con matriz de adyacencia:
1 grafoDirigidoBitMat* grafoDirigidoBitMat::cuadrado() const {
2 // devuelve otro grafo3 grafoDirigidoBitMat *resul = new grafoDirigidoBitMat(numVert);
4 for (int u=0; u
-
7/26/2019 arboles-091018235654-phpapp01.pdf
23/60
EDA-4
Ejercicio: Cuadrado de un grafo
Solucion con listas de adyacencia:
1 grafoListaAd *grafoListaAd::cuadrado() const {
2 grafoListaAd *resul = new grafoListaAd(vertices);3 for (int u=0; usig)
5 for (const arista* s=vec[r->vertice_destino]; s!=0; s=s->sig)
6 resul->insertar_arista(u, s->vertice_destino);
7 return resul;
8 }
FI UPV: Curso 2008/2009 Pagina 4.22
EDA 4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
24/60
EDA-4
3. ARBOLES: DEFINICIONES BASICAS
Bosque:es un grafo no dirigido acclico.
Arbol libre:es un grafo no dirigido acclico conexo.Arbol de recubrimiento de un grafo no dirigido G = (V, A): es un arbol libreT = (V, A) tal que V =V y A A.
Grafo Bosque Arbol
FI UPV: Curso 2008/2009 Pagina 4.23
EDA 4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
25/60
EDA-4
3. ARBOLES: DEFINICIONES BASICAS
Teorema (Propiedades de los arboles libres):
Sea G= (V, A) un grafo no dirigido. Los siquientes predicados son equivalentes:
1. G es un arbol libre.2. Cualquier par de vertices esta conectados por un unico camino.3. Ges conexo, pero si se elimina cualquier arista deA, el grafo resultante
no es conexo.
4. G es conexo y tiene|V| 1 aristas.5. G es acclico, y tiene|V| 1 aristas.6. G es acclico, pero si se anade una arista, se crea un ciclo.
Arbol
FI UPV: Curso 2008/2009 Pagina 4.24
EDA 4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
26/60
EDA-4
3. ARBOLES: DEFINICIONES BASICAS
Arbol enraizado
Un arbol enraizado es un arbol libre con un vertice (o nodo) distinguido denominado raz.
7
3
8 12
10 4
11 2
56 1
9
raz
Si existe un camino de un nodo xa un nodo y en un arbol T, se dice quexes antecesorde y, y que y es sucesor de x.Si (x, y) es el ultimo arco en el camino desde la raz r del arbol T hasta el nodo y,entonces x es el padre de y, e y es el hijo de x. La raz es el unico nodo en T que notiene padre. Si dos nodos tienen el mismo padre son hermanos.
FI UPV: Curso 2008/2009 Pagina 4.25
EDA 4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
27/60
EDA-4
3. ARBOLES: DEFINICIONES BASICAS
Arbol enraizado
Un nodo sin hijos lo denominaremos hoja. El resto son nodosinternos.El gradode un nodo es el numero de hijos que tiene.Se llama profundidadde un nodo a la longitud del camino desde la raz a ese nodo.La alturade un arbol es la profundidad del nodo mas profundo.
7
3
8 12
10 4
11 2
56 1
9
profundidad 0
profundidad 1
profundidad 2
profundidad 3
profundidad 4
altura=4
FI UPV: Curso 2008/2009 Pagina 4.26
EDA 4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
28/60
EDA-4
4. ARBOLES BINARIOS
Un arbol binario es un arbol en el que el maximo numero de hijos de cada
nodo es 2 (hijo izquierdoe hijo derecho).3
2
4 1
7
5
6
profundidad 0
profundidad 1
profundidad 2
profundidad 3
altura=3
Un arbol binario se dice que escompleto (o lleno) si todas las hojas tienenla misma profundidad y todos los nodos internos tienen grado 2.
Un arbol binario escasi-completosi el arbol es completo, a excepcion quizasen el nivel de las hojas, en el cual todas las hojas estan tan a la izquierdacomo sea posible.
FI UPV: Curso 2008/2009 Pagina 4.27
EDA 4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
29/60
EDA-4
Propiedades de los arboles binarios completos
0
1
2
3
h=3
1=2_0
2=2_1
4=2_2
8=2_3
profundidad num. nodos
Arbol binario completo de altura h= 3, con 8 hojas y 7 nodos internos
Numero de nodos: La raz tiene 2 hijos de profundidad 1, cada uno de los cuales tienen 2hijos de profundidad 2, etc. Nodos de profundidad i = 2i.
hojas:2h y nodos internos:20 + 21 + + 2h1 =h1
i=0 2i = 2h 1
nodos total:n=
hi=0 2i =2h+1 1
. . . y la altura
n= 2h+1 1 h= log2 n
FI UPV: Curso 2008/2009 Pagina 4.28
EDA 4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
30/60
EDA-4
Propiedades de los arboles binarios
El maximo numero de nodos de profundidad i es 2i.
El maximo numero de nodos en un arbol binario de altura h es2h+1 1. El maximo numero de nodos internos es2h 1. El maximonumero de hojas es2h.
La altura mnima de un arbol binario con n nodos es log2 n.
Para cualquier arbol binario no vaco, si n0 es el numero de hojas y
n2 es el numero de nodos de grado 2, entonces n0=n2+ 1.
Ejercicio. Arboles k-arios. Un arbol k-ario es un arbol en el que elmaximo numero de hijos de cada nodo es k (as, un arbol binario es unarbol k-ario con k = 2). Cuantas hojas tiene un arbol k-ario completo
de altura h? Y cuantos nodos internos?
FI UPV: Curso 2008/2009 Pagina 4.29
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
31/60
EDA-4
5. REPRESENTACION DE ARBOLES
Arboles (numero de hijos sin acotar)
Listas (ordenadas) de hijos.
Hijo mas a la izquierda-Hermano derecha: variables dinamicaso vectores.
Con vectores y direccion del padre.
Otros . . .
Arboles binarios
Hijo izquierdo e Hijo derecho para cada nodo: variablesdinamicas o vectores.
Arbol binario (casi-completo): vector (heaps).
Otros . . .
FI UPV: Curso 2008/2009 Pagina 4.30
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
32/60
EDA 4
5. REPRESENTACION DE ARBOLES
Listas (ordenadas) de hijos
1
3
10
5 6 7 11 12
2 9
4 8
1
2
3
4
5
6
7
10
8
9
10
11
12
NIL
5 6 NIL7
NIL
11 12 NIL
NIL
NIL
NIL
NIL
NIL
NIL
2 3 NIL9
4 8 NIL
raz
FI UPV: Curso 2008/2009 Pagina 4.31
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
33/60
EDA 4
5. REPRESENTACION DE ARBOLES
Hijo mas a la izquierda-Hermano derecha: variables dinamicas o vectores
B I
D H
A
C
J
E F G K L
2
3
4
....
8
9
10
....
12
13
14
16
17
....
15
K
F
LE
16
12
715
3
17
8
NIL
NIL
13
NIL
14
C
D
A
H
I
G
J
10
9
2B
NIL
NIL
NIL
NIL
NIL
NIL
NIL
NIL
NIL
raz
clave
hizq her_d
A
C
E F G K L
D H
B I
J
raz
hizq her_d
clave
FI UPV: Curso 2008/2009 Pagina 4.32
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
34/60
EDA 4
5. REPRESENTACION DE ARBOLES
Con vectores y direccion del padre
1
10
5 6 7 11 12
4 8
2 91
10
5 6 7 11 12
4 8
2 9
33
1 2 3 4 5 6 7 8 9 10 11 12
3 3 31 1 94 4 4 10 103
El nodo i es la raz del arbol si T[i] =i. Cada nodo apunta a supadre: T[i] =padre(i).
FI UPV: Curso 2008/2009 Pagina 4.33
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
35/60
5. REPRESENTACION DE ARBOLES
Arboles binarios: variables dinamicas o vectores(opcionalmente, puntero al padre)
C
B
D A
G
E
F
2
3
4
....
8
9
10
....
12
13
14
16
17
....
15 F
E
15
3
17
A
D
C
G
2B
NIL
12
NIL
raz 8
NIL NIL
NIL
NIL NIL
NIL
c ave
hderhizq
C
B
D A E
F
G
hizq hder
clave
raz
FI UPV: Curso 2008/2009 Pagina 4.34
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
36/60
5. REPRESENTACION DE ARBOLES
Arboles binarios (casi-completos): vector
raiz: T[1]
padre[i]=[i/2]
hizquierdo[i]=2i
hderecho[i]=2i+1
A
B C
G
KH I J L
FED
1
5
8 9 10 11 12
6 7
32
4
1 2 3 4 5 6 7 8 9 10 11 12
A ID H JE F G K L
13 14 ...
CB
hizquierdo
talla=12razpadre
hderecho
FI UPV: Curso 2008/2009 Pagina 4.35
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
37/60
6. RECORRIDOS DE ARBOLES BINARIOS
A veces puede interesar un recorrido sistematico y eficiente de todos los nodos del arbol.
A
B C
D E F
GH I
J
Recorrido enpreorden: A B D E H J I C F G
Recorrido en inorden: D B H J E I A F G C
Recorrido enpostorden: D J H I E B G F C A
Recorrido enniveles: A B C D E F H I G J
Coste de todos los algoritmos(n), siendonel numero de nodos del arboldespues de lallamada inicial, la funcion se llama recursivamente exactamente 2 veces para cada nodo delarbol: una vez para su hijo izquierdo y otra para su hijo derecho.
FI UPV: Curso 2008/2009 Pagina 4.36
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
38/60
6. Recorridos de arboles binarios: PREORDEN
La clave de la raz se imprimeantes de los valores de sus subarboles
A
B C
D E F
GH I
J
9 void nodo_abb::preorden() {
10 cout preorden();
13 }
FI UPV: Curso 2008/2009 Pagina 4.37
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
39/60
6. Recorridos de arboles binarios: INORDEN
La clave de la raz se imprimeentrelos valores de su subarbol izquierdo y derecho
A
B C
D E F
GH I
J
14 void nodo_abb::inorden() {
15 if (h_izq != 0) h_izq->inorden();16 cout
-
7/26/2019 arboles-091018235654-phpapp01.pdf
40/60
6. Recorridos de arboles binarios: POSTORDEN
La clave de la raz se imprimedespues de los valores de sus subarboles
A
B C
D E F
GH I
J
19 void nodo_abb::postorden() {
20 if (h_izq != 0) h_izq->postorden();21 if (h_der != 0) h_der->postorden();
22 cout
-
7/26/2019 arboles-091018235654-phpapp01.pdf
41/60
6. Recorridos de arboles binarios: NIVELES
En lugar de una pila (recursion) se utiliza una cola.
24 void abb::por_niveles() {25 cola *c = new cola(); // una cola de nodo_abb*26 nodo_abb *n;
27 c->insertar(raiz);
28 while (c->extraer(n)) {
29 if ( n ! = 0 ) { // se puede poner if (n) {
30 cout valor insertar(n->h_izq);
32 c->insertar(n->h_der);
33 }
34 }
35 delete c;
36 }
FI UPV: Curso 2008/2009 Pagina 4.40
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
42/60
Ejemplo arboles binarios: arbol de expresiones
Utilizacion de la estructura AB para representar expresiones aritmeticas con operadoresbinarios.
raz: operador principal
nodos internos: operadores de subexpresiones
hojas: operandos
(niveles: precedencia relativa de evaluacion)
x
+ -
e
a b
dc/
Recorrido en preorden: + / a b c d enotacion prefija o polaca
Recorrido en inorden:(((a/b) + c) (d e))notacion infija
Recorrido en postorden: a b / c + d e notacion postfija o polaca inversa
FI UPV: Curso 2008/2009 Pagina 4.41
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
43/60
7. RECORRIDOS DE GRAFOS
Metodo para recorrer de forma sistematica y eficiente un grafo.
Recorrido en profundidad: generalizacion del recorrido en preorden deun arbol
Recorrido en amplitud: generalizacion del recorrido en niveles de unarbol
En todos los algoritmos de recorrido de grafos supondremos que el grafoesta implementado con listas de adyacencia.
FI UPV: Curso 2008/2009 Pagina 4.42
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
44/60
Recorrido en profundidad de un grafo
Dado un grafo G= (V, A) y un vertice vV, la estrategia de recorrido
en profundidad (Depth-First Search (DFS)), explora sistematicamentelas aristas deGde manera que primero se visitan los vertices adyacentesa los visitados mas recientemente. De esta forma, se vaprofundizandoen el grafo; es decir, alejandose progresivamente dev.Este proceso continua hasta que todos los vertices alcanzables desde elvertice de la llamada original han sido descubiertos.
Esta estrategia admite una implementacion simple de forma recursiva yproporciona:
Ordenamientos de los vertices.
Clasificacion de las aristas.
Algunas aplicaciones:
Calcularun posibleorden topologico y comprobar si el grafo es acclico.
Encontrar las componentes fuertemente conexas de un grafo.
FI UPV: Curso 2008/2009 Pagina 4.43
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
45/60
Recorrido en profundidad de un grafo
El algoritmo DFS asocia los siguientes datos a cada vertice v del grafo:
d[v] instante en que el vertice v es descubierto
f[v] instante en que finaliza la exploracion del vertice v
pr[v] el vertice predecesor de v en el arbol generado (arbol deexploracion primero en profundidad, es un subgrafo del grafo original).
Elcolor asociado al vertice, que puede ser de 3 tipos:
WHITE cuando nunca ha sido explorado, GRAY mientras esta siendo explorado,
BLACK cuando ya ha sido explorado.
Al principio todos los vertices se ponen de color WHITE. Se utiliza unatributo time como contador para marcar los instantes.
FI UPV: Curso 2008/2009 Pagina 4.44
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
46/60
Recorrido en profundidad de un grafo
1 void grafo::dfs_visit(int u) {// algoritmo recursivo del DFS
2 color[u] = GRAY;
3 d[u] = ++time;
4 for (arista *r = vec[u]; r != 0; r = r->sig) {
5 int v = r->vertice_destino;
6 if (color[v] == WHITE) { pr[v] = u;
7 dfs_visit(v); }
8 }
9 color[u] = BLACK;
10 f[u] = ++time;
11 }
12 void grafo::dfs() {
13 for (int u=0; u < numVert; ++u) { color[u] = WHITE;
14 pr[u] = -1; }
15 time = 0;
16 for (int u=0; u < numVert; ++u)
17 if (color[u] == WHITE) dfs_visit(u);18 }
Coste (|V| + |A|)
FI UPV: Curso 2008/2009 Pagina 4.45
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
47/60
Recorrido en profundidad de un grafo: Ejemplo
Grafo:
8 verticesaristas:
0 1
0 2
0 3
0 4
1 4
2 33 1
3 4
5 6
6 7
5 7
7 5
FI UPV: Curso 2008/2009 Pagina 4.46
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
48/60
Recorrido en profundidad de un grafo: Ejemplo
dfs_visit(0)
(0,4) is a TREE EDGE
dfs_visit(4)
(0,3) is a TREE EDGE
dfs_visit(3)
(3,4) is a FORWARD/CROSS EDGE
(3,1) is a TREE EDGE
dfs_visit(1)
(1,4) is a FORWARD/CROSS EDGE
(0,2) is a TREE EDGEdfs_visit(2)
(2,3) is a FORWARD/CROSS EDGE
(0,1) is a FORWARD/CROSS EDGE
dfs_visit(5)
(5,7) is a TREE EDGE
dfs_visit(7)
(7,5) is a BACK EDGE(5,6) is a TREE EDGE
dfs_visit(6)
(6,7) is a FORWARD/CROSS EDGE
FI UPV: Curso 2008/2009 Pagina 4.47
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
49/60
Recorrido en profundidad de un grafo: Ejemplo
v d[v] f[v] pr[v]
0 1 10 -1
1 5 6 3
2 8 9 0
3 4 7 0
4 2 3 05 11 16 -1
6 14 15 5
7 12 13 5
FI UPV: Curso 2008/2009 Pagina 4.48
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
50/60
Recorrido en profundidad de un grafo
Clasificacion de las aristas. Una arista(u, v) es de tipo:
TREE o del arbol: si el vertice v ha sido descubierto a traves de
dicha arista. Estas aristas definen el bosque del recorrido primero enprofundidad, formado por uno o mas arboles.
BACK o hacia atras: siv es unantecesordeu en el arbol del recorridoprimero en profundidad.
FORWARD o hacia adelante: siv es undescendientede uen el arboldel recorrido primero en profundidad.
CROSS o de cruce: ningun vertice es antecesor del otro.
El recorrido DFS puede ser utilizado para clasificar las aristas a medidaque las va procesando. Cuando desde un verticeu se considera la arista(u, v), se puede observar el color del vertice destinov:
WHITE indica que es una arista del arbol o TREE.GRAY indica que es una arista hacia atras o BACK.
BLACK indica que es hacia delante o de cruce. Sid[u]< d[v]es haciadelante y si d[u]> d[v] es de cruce.
FI UPV: Curso 2008/2009 Pagina 4.49
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
51/60
Recorrido en profundidad de un grafo
Relacion de tipo parentesis: en la busqueda primero en profundidad,dados dos vertices del grafo u y v, se cumple exactamente una de estastres posibilidades:
los intervalos [d[u], f[u]] y [d[v], f[v]] son enteramente disjuntos. Eneste caso, niues descendiente dev en el arbol DFS ni v descendientede u.
el intervalo [d[u], f[u]] esta contenido enteramente dentro del inter-valor [d[v], f[v]] y ues descendiente de v en el arbol DFS.
el intervalo[d[v], f[v]]esta contenido enteramente dentro del intervalor[d[u], f[u]] y v es descendiente deu en el arbol DFS.
La relacion de estos intervalos tambien sirve para clasificar las aristas,as la arista(u, v) es:
del arbol si d[u]< d[v]< f[v]< f[u]
hacia atras si d[v]< d[u]< f[u]< f[v]
de cruce si d[v]< f[v]< d[u]< f[u]
FI UPV: Curso 2008/2009 Pagina 4.50
EDA-4
-
7/26/2019 arboles-091018235654-phpapp01.pdf
52/60
Orden topologico
Un orden topologico de un grafo dirigido acclico G = (V, A) es unaordenacion de los vertices de forma que si(u, v) A, entoncesu aparece
antes que v. (La solucion no es unica.) Ejem.: prerrequisitos de losestudios.
No es posible la ordenacion topologica cuando existen ciclos!
c
b
ed
a
a b d e c
d a e b c
Orden no unico.
Ordenacion de vertices en eje horizontal con las aristas de izquierda a derecha.
FI UPV: Curso 2008/2009 Pagina 4.51
EDA-4
O
-
7/26/2019 arboles-091018235654-phpapp01.pdf
53/60
Orden topologico
Dado un grafo G = (V, A), el DFS puede usarse para determinar si esacclico y, en ese caso, obtenerunorden topologico.
El grafo es acclico si no tiene ninguna arista hacia atras.El orden en que finaliza la exploracion de los vertices (valor guardadoen f[v]) es un orden topologico invertido.
1 void grafo::dfs_visit(int u) {
2 color[u] = GRAY;
3 d[u] = ++time;4 for (arista *r = vec[u]; r != 0; r = r->sig) {
5 int v = r->vertice_destino;
6 if (color[v] == WHITE) { pr[v] = u;
7 dfs_visit(v);
8 } else if (color[v] == GRAY) es_aciclico = false;
9 } // es_aciclico esta a true antes de empezar DFS
10 color[u] = BLACK;11 f[u] = time;
12 topologic_sort.push_front(u); // insertar al ppio
13 }
FI UPV: Curso 2008/2009 Pagina 4.52
EDA-4
R id f did d d f Ej l 2
-
7/26/2019 arboles-091018235654-phpapp01.pdf
54/60
Recorrido en profundidad de un grafo: Ejemplo 2
Grafo:11
0 1
0 2
1 3
2 4
3 2
3 4
3 5
5 7
4 6
4 7
1 8
1 9
8 10
9 10
dfs_visit(0)
(0,2) is a TREE EDGE
dfs_visit(2)
(2,4) is a TREE EDGE
dfs_visit(4)
(4,7) is a TREE EDGE
dfs_visit(7)
(4,6) is a TREE EDGE
dfs_visit(6)
(0,1) is a TREE EDGE
dfs_visit(1)
(1,9) is a TREE EDGE
dfs_visit(9)
(9,10) is a TREE EDGE
dfs_visit(10)
(1,8) is a TREE EDGE
dfs_visit(8)
(8,10) is a FORWARD/CROSS EDGE
(1,3) is a TREE EDGE
dfs_visit(3)
(3,5) is a TREE EDGE
dfs_visit(5)
(5,7) is a FORWARD/CROSS EDGE
(3,4) is a FORWARD/CROSS EDGE
(3,2) is a FORWARD/CROSS EDGE
FI UPV: Curso 2008/2009 Pagina 4.53
EDA-4
R id f did d d f Ej l 2
-
7/26/2019 arboles-091018235654-phpapp01.pdf
55/60
Recorrido en profundidad de un grafo: Ejemplo 2
v d[v] f[v] pr[v]
0 1 22 -1
1 10 21 0
2 2 9 0
3 17 20 1
4 3 8 25 18 19 3
6 6 7 4
7 4 5 4
8 15 16 1
9 11 14 1
10 12 13 9
Un posible orden topologico: 0 1 3 5 8 9 10 2 4 6 7
FI UPV: Curso 2008/2009 Pagina 4.54
EDA-4
O l i l d l i i DFS
-
7/26/2019 arboles-091018235654-phpapp01.pdf
56/60
Otro algoritmo para el orden topologico, sin DFS
1 void grafo::orden_topologico_sin_dfs() { // test aciclicidad
2 int u,v; arista *r;
3 for (v=0; v < numVert; ++v) grado_entrada[v] = 0;
4 for (v=0; v < numVert; ++v)
5 for (r = vec[v]; r != 0; r = r->sig)
6 grado_entrada[r->vertice_destino]++;
7 col->vaciar();
8 for (v=0; v < numVert; v++)
9 if (grado_entrada[v] == 0) col->insertar(v);
10 for (n = 0; col->extraer(u); n++) {
11 topologic_sort.push_back(u); // insertar al final
12 for (arista *r = vec[u]; r != 0; r = r->sig) {
13 grado_entrada[r->vertice_destino]--;
14 if (grado_entrada[r->vertice_destino] == 0)
15 col->insertar(r->vertice_destino);
16 }
17 }18 es_aciclico = (n == numVert);
19 }
FI UPV: Curso 2008/2009 Pagina 4.55
EDA-4
R id lit d d f
-
7/26/2019 arboles-091018235654-phpapp01.pdf
57/60
Recorrido en amplitud de un grafo
Dado un grafo G = (V, A) y un vertice s V, la estrategia derecorrido en amplitud o en anchura (Breadth-First Search (BFS)),explora sistematicamente las aristas deG de manera que primero sevisitan los verticesmas cercanos a v.
Algunos algoritmos importantes de grafos tienen una estructura similaral BFS. Por ejemplo, el algoritmo de Prim para encontrar el arbol deexpansion de mnimo coste, o el algoritmo de Dijkstra para encontrarlos caminos mas cortos desde un vertice dado.
El algoritmo BFS explora todos los vertices a distancia k del verticeorigen s antes de empezar a explorar los vertices a distancia k+ 1.Al igual que DFS, se utiliza un vector de tipo color para marcar losvertices del grafo como no visitados (WHITE), visitandose (GRAY) oya visitados (BLACK).
Tambien se genera un vector de predecesores para obtener un arbol.
FI UPV: Curso 2008/2009 Pagina 4.56
EDA-4
R id lit d d f
-
7/26/2019 arboles-091018235654-phpapp01.pdf
58/60
Recorrido en amplitud de un grafo
1 void grafo::bfs(int vertice) {
2 cola.clear();
3 for (int u=0; u < numVert; ++u) {
4 color[u]=WHITE; pr[u]=-1; d[u]=numVert+1;
5 // numVert+1> cualquier distancia en el grafo
6 }
7 cola.push_back(vertice);
8 d[vertice] = 0;
9 while (!cola.empty()) {
10 int u = cola.front(); cola.pop_front(); // extraer
11 for (arista *r = vec[u]; r != 0; r = r->sig) {
12 int v = r->vertice_destino;
13 if (color[v] == WHITE) {
14 color[v]=GRAY; d[v]=d[u]+1; pr[v]=u;
15 cola.push_back(v);
16 }
17 }18 color[u] = BLACK;
19 }
20 }
FI UPV: Curso 2008/2009 Pagina 4.57
EDA-4
R id lit d d f Ej l
-
7/26/2019 arboles-091018235654-phpapp01.pdf
59/60
Recorrido en amplitud de un grafo: Ejemplo
Grafo:
110 1
0 2
1 3
2 4
3 2
3 4
3 55 7
4 6
4 7
1 8
1 9
8 10
9 10
FI UPV: Curso 2008/2009 Pagina 4.58
EDA-4
R id lit d d f Ej l
-
7/26/2019 arboles-091018235654-phpapp01.pdf
60/60
Recorrido en amplitud de un grafo: Ejemplo
Cola: salen< 0