Upload
carlos-chavarri-torres
View
11
Download
0
Embed Size (px)
Citation preview
Tema 14 Grafos y su Implementacin en Java
Parte II
Germn MoltEscuela Tcnica Superior de Ingeniera Informtica
Universidad Politcnica de Valencia
1
Tema 14 Grafos y su Implementacin en Java
ndice general:1. Conceptos bsicos sobre Grafos2. Representacin de un Grafo: Matriz vs Listas de Adyacencia3. Representacin de un Grafo Ponderado: la clase Adyacente4. Representacin de un Grafo ponderado y etiquetado: La clase
GrafoDEtiquetado.5. Recorrido en Profundidad (DFS) de un Grafo 6. Recorrido en Amplitud (BFS) de un Grafo
2
Recorrido de un Grafo: Ampliacin de la clase Grafo
Los recorridos permiten obtener una secuencia de sus elementos.
Recorrido en Profundidad o Depth First Search (DFS) Generalizacin del Recorrido Pre-Orden de un rbol Explora las aristas del Grafo de manera que se visitan los
vrtices adyacentes al recin visitado, con lo que se consigue profundizar en las ramas del Grafo.
Recorrido en Anchura o Breadth First Search (BFS) Generalizacin del Recorrido por Niveles de un rbol. Explora las Aristas del Grafo de manera que se visitan los
vrtices adyacentes al explorado actualmente. Para cada uno de esos vrtices, se exploran sus vecinos, provocando un recorrido en anchura.
3
Recorrido en Profundidad (DFS) de un Grafo En rboles Binarios conseguamos hacer un recorrido en
profundidad de la siguiente manera:
En Grafos lo haremos de manera similar:
4
PreOrden (rbol) {PreOrden(Razrbol);
}
tratar(Razrbol);Hijo(Razrbol)
PreOrden(Hijo(Razrbol));
DFS(Grafo) { Verticei Grafo
DFS(Verticei);}
tratar(Vrticei); adyacente(Vrticei)
DFS(adyacente(Vrticei));
Ejemplo de Recorrido en Profundidad
5
8 79
14
10
478
112
a
h
b dc
e
g
i
f
4
1 2
a
h
b
2 (8)1
2
3
4
5
6..
a 3 (4)
h 3 (11) 1 (8) 4 (1) 5 (7)
1 (4) 2 (11) 6 (8)b
i
g
c
....
....
...... ...... ....
Deberemos anotar los vrtices ya visitados para no recorrerlos varias veces.
Utilizamos un vector de vrtices ya visitados.
Gestin de Visitados para DFS
Utilizar atributos para marcar los Vrtices ya visitados: si visitados[i] == 0, el Vrtice i NO se ha visitado an si visitados[i] > 0, el Vrtice i S se ha visitado.
El valor de visitados[i] indica el orden en el que se ha visitado el Vrtice:
De esta manera se interpretar: visitados[3] = 5 El Vrtice 3 se ha visitado en 5 posicin, es
decir, antes se han visitado otros 4 vrtices.
6
Traza de Recorrido en Profundidad: DFS (1/9)
7
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
1
1
Vrtice origen: 1
Traza de Recorrido en Profundidad: DFS (2/9)
8
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
2
1
2
Traza de Recorrido en Profundidad: DFS (3/9)
9
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
3
1
2
3
Traza de Recorrido en Profundidad: DFS (4/9)
10
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
1
2
3
Traza de Recorrido en Profundidad: DFS (5/9)
11
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
1
2
3 46
Traza de Recorrido en Profundidad: DFS (6/9)
12
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
1
2
36
5
7
Traza de Recorrido en Profundidad: DFS (7/9)
13
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
1
2
36
7
Traza de Recorrido en Profundidad: DFS (8/9)
14
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
1
2
36
7
86
Traza de Recorrido en Profundidad: DFS (9/9)
15
27
3
1
5
4
9
8
6
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
1
2
36
7
784
.....
Traza de Recorrido en Profundidad: DFS (Final)
16
Vertices visitados 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1:2,3,4,5 1 - - - - - - - - 2 - 2 - - - - - - - 3:2,6,8 - - 3 - - - - - - 6:7 - - - - - 4 - - - 7:2 - - - - - - 5 - - 8:6 - - - - - - - 6 - 4:3,8 - - - 7 - - - - - 5 - - - - 8 - - - - 9:5,8 - - - - - - - - 9
1 2 3 7 8 4 5 6 9
27
3
1
5
4
9
8
6
La secuencia de vrtices visitados (DFS) es: 1 2 3 6 7 8 4 5 9
Ampliacin de la clase Grafo para Soporte de DFS
public abstract class Grafo{ protected int visitados[]; //Para el recorrido DFSprotected int ordenVisita; //Orden de visita de los vrtices
public String toStringDFS() {...}protected String arrayToString(int v[]){ }public int[] toArrayDFS() { }protected void toArrayDFS(int origen, int res[]) { }
} /* Fin de la clase Grafo */
17
Ampliamos la clase Grafo para soportar la implementacin del recorrido DFS.
Mtodos de Soporte para DFS (I)public int[] toArrayDFS() {
int res[] = new int[numVertices() + 1];visitados = new int[numVertices() + 1];ordenVisita = 1;for (int i = 1; i
Recorrido en Anchura (BFS) de un Grafo
PorNiveles (rbol) { PorNiveles(Razrbol);
}
21
Cola q = new ArrayCola();
q.encolar(Razrbol); mientras ( !q.esVacia() ){
r = q.desencolar();tratar(r); Hijo(r): q.encolar(Hijo(r));
}
BFS(Grafo) {Cola q = new
ArrayCola(); Verticei Grafo
BFS(Verticei);}
tratar(Vrticei); q.encolar(Vrticei); mientras ( !q.esVacia() ) {
v = q.desencolar();Adyacente(v):
tratar(Adyacente(v) ); q.encolar(Adyacente(v));
}
En rboles Binarios conseguamos hacer un recorrido por niveles (o en anchura) de la siguiente manera:
En Grafos se hace:
Traza de Recorrido en Anchura: BFS
22
1 (8)0
1
2
3
4
5
6..
a 2 (4)
h 2 (11) 0 (8) 3 (1) 4 (7)
0 (4) 1 (11) 5 (8)b
i
g
c
6(2)
1 (7) 5 (2)
1 (1)
6 (4) 7 (7)
f 8 (10) 7 (14)
2 (8)4 (2)
5 (4).. ........
8 79
14
10
478
112
a
h
b dc
e
g
i
f
4
1 2
a
h
b c
i
g0|1| 2| 3| 4| 5|
f6|
d
7|
Estado de la Cola de Vrtices por procesar:
Vrtice origen: a
Aunque en esta traza los vrtices se numeren de 0..N, de normal los numeramos de 1..N
Traza de Recorrido en Anchura: BFS (Final)
Vrtice Visitados Cola
1 2 3 4 5 6 7 8 90 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1
1: 2 3 4 5 1 2 3 4 5 0 0 0 0 2 3 4 5
2: 1 2 3 4 5 0 0 0 0 3 4 5
3: 2 6 8 1 2 3 4 5 6 0 7 0 4 5 6 8
4: 3 8 1 2 3 4 5 6 0 7 0 5 6 8
5: 1 2 3 4 5 6 0 7 0 6 8
6: 7 1 2 3 4 5 6 8 7 0 8 7
8: 6 1 2 3 4 5 6 8 7 0 7
7: 2 1 2 3 4 5 6 8 7 0
9: 5 8 1 2 3 4 5 6 8 7 9
23
La secuencia de vrtices visitados (BFS) es: 1 2 3 4 5 6 8 7 9
Vrtice origen: 1
27
3
1
5
4
9
8
6
Ampliacin de la clase Grafo para Soporte de BFSpublic abstract class Grafo{
/** Para el recorrido DFS y BFS */protected int visitados[];protected int ordenVisita;/** para el Recorrido en Anchura (BFS) */protected Cola q;
public String toStringBFS() { }public int[] toArrayBFS() { }protected void toArrayBFS(int origen, int res[]) { }
} /* Fin de la clase Grafo */
24
El mtodo toArrayBFS (1/2)public String toStringBFS() {
return arrayToString(toArrayBFS());
}
}
public int[] toArrayBFS() {int res[] = new int[numVertices() + 1];
visitados = new int[numVertices() + 1];
ordenVisita = 1;
q = new ArrayCola();
for ( int i = 1; i