19
Tema 9: GRAFOS Estructuras de Datos y Algoritmos Curso 2004/05 Grafos. EDA. Curso 2003/04 2 OBJETIVOS z Definiciones formales de grafo y conceptos relacionados z Estructuras de datos para representar grafos z Algoritmos para resolver diferentes variantes del problema de encontrar el camino mínimo sobre un grafo z Algoritmos para resolver el problema de encontrar el árbol de extensión de coste mí nimo sobre un grafo Grafos. EDA. Curso 2003/04 3 ÍNDICE z 1. Introducción z 2. Conceptos Básicos z 3. Implementaci ón de grafos z 4. Recorridos de grafos z 5. Búsqueda del camino con peso mínimo: algoritmo de Dijkstra z 6. Otros problemas de caminos en GAD yOrdenación topológica yBúsqueda de caminos mínimos z 7. Problema de obtención de árboles de extensión sobre grafos no dirigidos yAlgoritmos de Prim y Kruskal

Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

Embed Size (px)

Citation preview

Page 1: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

1

Tema 9: GRAFOSEstructuras de Datos y Algoritmos

Curso 2004/05

Grafos. EDA. Curso 2003/042

OBJETIVOS

zDefiniciones formales de grafo y conceptos relacionadosz Estructuras de datos para representar grafoszAlgoritmos para resolver diferentes variantes del

problema de encontrar el camino mínimo sobre un grafozAlgoritmos para resolver el problema de encontrar el

árbol de extensión de coste mínimo sobre un grafo

Grafos. EDA. Curso 2003/043

ÍNDICE

z 1. Introducciónz 2. Conceptos Básicosz 3. Implementaci ón de grafosz 4. Recorridos de grafosz 5. Búsqueda del camino con peso mínimo: algoritmo de

Dijkstraz 6. Otros problemas de caminos en GADyOrdenación topológicayBúsqueda de caminos mínimos

z 7. Problema de obtención de árboles de extensión sobre grafos no dirigidosyAlgoritmos de Prim y Kruskal

Page 2: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

2

Grafos. EDA. Curso 2003/044

BIBLIOGRAFÍA

Básica:z Weiss, M.A. Estructuras de datos en Java. Adisson-Wesley, 2000.

y Capítulos 14 y 23

Otros:z T.H. Cormen, C.E. Leiserson, R.L. Rivest. Introduction to Algorithms.

MIT Press, 1990.y Capítulos 5 y 23.

z Aho A.V., Hopcroft J.E., Ullman J.E. Estructuras de datos y Algoritmos. Addison-Wesley, 1988. y Capítulos 6 y 7.

Grafos. EDA. Curso 2003/045

1. INTRODUCCIÓN

zUn grafo permite representar relaciones binariasrelaciones binarias entre los elementos de un conjunto.

18

30

23

2535

4921

39

25

Ejemplos:•Rutas de transporte•Envío de correo electrónico

Grafos. EDA. Curso 2003/046

CONCEPTOS BÁSICOS

z Grafos dirigidos y no dirigidosz Grafos etiquetadosz Relaciones de incidencia y adyacenciaz Caminosz Subgrafosz ConectividadzÁrboles y Grafos

Page 3: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

3

Grafos. EDA. Curso 2003/047

Grafos Dirigidos (DiGrafos )

zUn grafo dirigidografo dirigido (g.d.) es un par G=(V,E)yV es un conjunto finito de vértices (nodos)yE es un conjunto de arcos (o aristas). Un arco es un par

ordenado(u,v) con u,v∈V

1 2 3

5 64

V={1,2,3,4,5,6}

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

Grafos. EDA. Curso 2003/048

zUn grafo no dirigidografo no dirigido (G.N.D) es un par G=(V,E)yV es un conjunto finito de vértices (nodos)yE es un conjunto de arcos (aristas). Un arco es un par NO

ordenado (u,v) con u,v∈V, u≠v

Grafos no dirigidos

V={1,2,3,4,5,6}

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

1 2 3

5 64

Grafos. EDA. Curso 2003/049

Grafos Etiquetados

zUn grafo etiquetado es un grafo G=(V,E) sobre el que se define una función f:E->A, dónde A es un conjunto cuyas componentes se llaman etiquetas.

zUn grafo ponderado (o con pesos o costes) es un grafo etiquetado con números reales (A≡ℜ)

Page 4: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

4

Grafos. EDA. Curso 2003/0410

Relaciones de Incidencia y Adyacencia

z Sea G=(V,E) un grafo dirigido. Si (u,v)∈E, decimos que incide desdeincide desde u (sale de..) e incide enincide en v (llega a..).Ejemplo: vértice 2

1 2 3

5 64

Grafos. EDA. Curso 2003/0411

Relaciones de Incidencia y Adyacencia (cont.)

z Sea G=(V,E) un grafo no dirigido. Si (u,v)∈E, decimos que incide sobreincide sobre u y v.

z Ejemplo: vértice 2

1 2 3

5 64

Grafos. EDA. Curso 2003/0412

Relaciones de Incidencia y Adyacencia (cont.)

z Sea G=(V,E) un grafo. Si (u,v)∈E, decimos que el vértice v es adyacenteadyacente al u.yLa relación es sim étrica en grafos no dirigidos

1 2 3

5 64

2 es adyacente a 11 es adyacente a 2

1 2 3

5 64

2 es adyacente a 11 NO es adyacente a 2

Page 5: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

5

Grafos. EDA. Curso 2003/0413

Relaciones de Incidencia y Adyacencia (cont.)

z Llamaremos grado de un vgrado de un véérticertice en un g.n.d. al nº de arcos que inciden sobre él.

1 2 3

5 64

El grado de 2 es 2

Grafos. EDA. Curso 2003/0414

Relaciones de Incidencia y Adyacencia (cont.)

z El grado de un vgrado de un véérticertice en un g.d. es el nº de arcos que salen de él (grado de salida) más el nº de arcos que entran (grado de entrada).

1 2 3

5 64

Grado de entrada del 2=2, Grado de salida del 2 =3Grado de 2=5

Grafos. EDA. Curso 2003/0415

Relaciones de Incidencia y Adyacencia (cont.)

z El grado de un grafo es el del vértice de máximo grado.

1 2 3

5 64

El grado de este grafo es 5

Page 6: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

6

Grafos. EDA. Curso 2003/0416

Caminos

zUn caminocamino de de longitud klongitud k desde desde uu a a uu’’ en un grafo G=(V,E)es una secuencia de vértices ⟨v0,v1,..,vk⟩ tal que vo=u y vk=u’y ∀i:1..k:(vi-1,vi)∈E. La longitud del camino es el número de arcos.

z La longitud del camino con pesos es la suma d elos costes de las aristas que forman el camino

z Si hay un camino P desde u hasta u’ , decimos que u’ es alcanzablealcanzable desde u via P.

Grafos. EDA. Curso 2003/0417

Caminos (cont.)

zUn caminocamino es simplesimple si todos sus vértices son distintos.

1 2 3

5 64

<1,2,5,4> es un camino simple de longitud 3

<2,5,4,5> no es un camino simple

Grafos. EDA. Curso 2003/0418

Caminos (cont.)

z En un g.d. un camino <v0,v1,..,vk> forma un ciclociclo si v0=vk yel camino contiene al menos un arco. yEl ciclo es simple si los vértices son distintosyUn bucle es un ciclo de longitud 1

1 2 3

5 64

<1,2,5,4,1> es un ciclo

Page 7: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

7

Grafos. EDA. Curso 2003/0419

Caminos (cont.)

z En un g.n.d. un camino <v0,v1,..,vk> forma un ciclociclo si v0=vk y los vi son distintos.

zUn grafo sin ciclos diremos que es acacííclicoclico (GDA)(GDA)

Grafos. EDA. Curso 2003/0420

Ejercicio

z Sea G = (V,E) un Grafo dirigido con pesosV={v0,v1, v2, v3, v4, v6, v6 }, E={ (v0, v1, 2), (v0, v3, 1), ( v1,v3, 3), (v1, v4, 10),

(v3,v4 , 2), (v3, v6, 4), ( v3,v5, 8), (v3, v2, 2), (v2,v0 , 4), (v2, v5, 5), ( v4,v6, 6), (v6, v5, 1) }

Se pide: 1.- |V| y |E|2.- Vértices adyacentes a cada v i

3.- Grado de cada vi y del Grafo 4.- Caminos desde v0 al resto de V értices, su longitud y su longitud con pesos 5.- Vértices alcanzables desde v 0

6.- Caminos mínimos desde v 0 al resto de Vértices 7.- ¿Tiene ciclos?

Grafos. EDA. Curso 2003/0421

Solución del ejercicio

4.- Caminos desde v 0 al resto de Vértices, su longitud y su longitud con pesos

Camino desde v0 a v0 : no hay → longitud 0Camino desde v0 a v 1 : ⟨ v0,v1⟩ , de longitud 1Caminos desde v0 a v2 : ⟨ v0,v1,v3,v2⟩ de longitud 3

⟨ v0,v3,v2⟩ de longitud 2Caminos desde v0 a v4 : ⟨ v0,v1,v4⟩ de longitud 2

⟨ v0,v3,v4⟩ de longitud 2⟨ v0,v1,v3,v4⟩ de longitud 3

⟨ v0,v3,v2,v0, ....⟩ de longitud ……

...

v0 v1

v2 v3 v4

v5 v6

2

4

1

101 3

2 24865

Page 8: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

8

Grafos. EDA. Curso 2003/0422

Subgrafos

zUn grafo G’=(V’,E’ ) es un subgrafo de G=(V,E) si V’⊆V y E’⊆E.

zDado un conjunto V’⊆V, el subgrafo de G inducido por V’es G’=(V ’,E’):E’={(u,v)∈E:u,v∈V’}

1 2 3

6

Ejemplo: subgrafo inducido por {1,2,3,6}

1 2 3

5 64

Grafos. EDA. Curso 2003/0423

Conectividad de un grafo

zUn g.n.d. es conexoconexo si cualquier par de vértices están conectados por un camino. Las componentes conexascomponentes conexas de un grafo son las clases de equivalencia en V definidas por la relaci ón “es alcanzable desde..”

1 2 3

5 64

Grafos. EDA. Curso 2003/0424

Conectividad de un grafo (cont.)

zUn g.d. es fuertemente conexofuertemente conexo si cualquier vértice es alcanzable desde cualquier otro. Las componentes componentes fuertemente conexasfuertemente conexas de un grafo son las clases de equivalencia en V definidas por la relaci ón “son mutuamente alcanzables”

1 2 3

5 64

Page 9: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

9

Grafos. EDA. Curso 2003/0425

Árboles

zUn bosquebosque es un grafo acíclico no dirigido.zUn grafo acíclico, no dirigido y conexo es un áárbol rbol (libre)(libre).

(a) Árbol (b) Bosque (c) Grafo

Grafos. EDA. Curso 2003/0426

Árboles

z Teorema: Sea G=(V,E) un g.n.d. Las siguientes afirmaciones son equivalentes:yG es un árbol (libre)yCualquier par de vértices en G están conectados por un único

camino simpleyG es conexo y |E|=|V|-1yG es acíclico pero si añadimos un arco a E, el grafo resultante

contiene un ciclo

Dem. Pág. 91-93 [Cormen,90]

Grafos. EDA. Curso 2003/0427

Árboles con raíz

zUn ÁÁrbol con rarbol con raíízz es un árbol con un vértice distinguido denominado raíz.

7

3 10 4

128 211

56 1

9

Page 10: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

10

Grafos. EDA. Curso 2003/0428

Árbol de recubrimiento de un gnd

zUn árbol de recubrimiento del grafo G=(V,E) es un árbol libre T=(V’ ,E’) tal que V’=V y E’ ⊆E

z Ejemplo:

a

h

b dc

e

g

i

f

48 7

914

10

478

112 Peso total=37

Grafos. EDA. Curso 2003/0429

2. REPRESENTACIÓN DE GRAFOS

zz Listas de AdyacenciaListas de Adyacencia: Un grafo G=(V,E) se representa como un vector de listas de vértices indexado por vértices. G[v] es una lista de los v értices emergentes y/o incidentes de/a v∈V.yMemoria: O(|V|+|E|)yTiempo de acceso: O(Grado(G))

zzMatriz de AdyacenciasMatriz de Adyacencias: Un grafo G=(V,E) se representa como una matriz indexada por vértices de booleanos. La componente G[u,v] es true si (u,v)∈E, sino G[u,v]=false.yMemoria: O(|V| 2)yTiempo de acceso: O(1)

Grafos. EDA. Curso 2003/0430

Ejemplos

Page 11: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

11

Grafos. EDA. Curso 2003/0431

Implementación de grafos

z Basada en listas de adyacencia:yImplementación básica:⌧Grafos sin pesos⌧Vértices numerados desde 0 hasta |V|-1

yImplementación de grafos ponderados⌧La clase Arista

yLos vértices no están numerados desde 0 hasta |V| -1⌧Utilización de un diccionario (tabla hash)⌧La clase Vertice

Grafos. EDA. Curso 2003/0432

Implementación básicapublic class Grafo {private Lista tabla [];private int numVertices;public Grafo(int N) {

numVertices=N; tabla=new LEIListaConPI[N];// o directamente tabla=new NodoLista [N];}public void insArista (int orig, int dest) {

if (tabla[orig]==null) tabla[orig]=new LEIListaConPI();tabla[orig].insertar(new Integer(dest));// o con NodoListas, si no interesa el orden directamente:// tabla[orig]=new NodoLista(new Integer(dest), tabla[orig]);// ejercicio: NodoListas y orden entre las aristas

}public String toString() {

String s="";for (int i=0; i<numVertices; i++)if (tabla[i]!=null) s+="Or:"+i+"Ady="+tabla[i].toString()+"\n";

return s;}

}

Grafos. EDA. Curso 2003/0433

Programa de pruebapublic class pruebaGrafo {

public static void main (String args[]) {BufferedReader in=new BufferedReader(newInputStreamReader(System.in));System.out.println("Escribe pares de vértices separados por blancos:");Grafo GM;

try {String linea=in.readLine();while (linea.length()!=0){

StringTokenizer st=new StringTokenizer(linea);int N=Integer.parseInt(st.nextToken());GM=new Grafo(N);int orig=Integer.parseInt(st.nextToken());int dest=Integer.parseInt(st.nextToken());GM.insArista(orig,dest);linea=in.readLine();

} }catch (IOException e) {}System.out.println("Grafo leído:");System.out.println(GM.toString());}

}

Page 12: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

12

Grafos. EDA. Curso 2003/0434

Ejemplo de ejecuci ón

Escribe pares de vértices separados por blancos:

1 21 42 53 53 64 25 46 6

Grafo leído:

Orig:1 Ady= 4 2Orig:2 Ady= 5Orig:3 Ady= 6 5Orig:4 Ady= 2Orig:5 Ady= 4Orig:6 Ady= 6

Grafos. EDA. Curso 2003/0435

Ejercicio (casa)

zDefinir los siguientes métodos en la clase Grafo:yMétodo constructor para crear el grafo a partir de la información

de arcos leída desde un ficheroyMétodo para consultar el número total de arcos de un grafoyMétodo para consultar el grado de un vértice dado (grado de

salida si el grafo es dirigido)yMétodo para consultar el grado del grafo (grado de salida si el

grafo es dirigido)yMétodo para comprobar si el grafo está vacíoyMétodo para comprobar si un determinado arco pertenece al

grafo

Grafos. EDA. Curso 2003/0436

Implementación de un grafo ponderado

public class Grafo {private Lista tabla [];private int numVertices;public Grafo(int N) {

numVertices=N; tabla=new LEIListaConPI[N];}public void insArista (int orig, int dest, int coste) {

if (tabla[orig]==null) tabla[orig]=new LEIListaConPI();tabla[orig].insertar(new Arista(dest,coste));// mismos comentarios si se decide usar directamente // NodosLista

}public String toString() {

String s="";for (int i=0; i<numVertices; i++)if (tabla[i]!=null) s+="Or:"+i+"Ady="+tabla[i].toString()+"\n";

return s;}

}

Page 13: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

13

Grafos. EDA. Curso 2003/0437

La clase Arista

public class Arista {

// atributos: el vértice destino y el coste del arcoprivate int dest;private int coste;

public Arista(int v, int c) {dest=v;coste=c;

}

public String toString(){return dest+“ ("+coste+")";

}

}

Grafos. EDA. Curso 2003/0438

Implementación de grafos en Java

z La clase Grafoz La clase Aristaz La clase Vértice

GrafoEs un

vector de... Vértices

Tiene una

lista de...

Aristas

Grafos. EDA. Curso 2003/0439

Ejemplo:D C 10A B 12D B 23A D 87E D 43B E 11C A 19

Los nombres de los vértices...

z En general, los vértices tendrán nombres asociados, típicamente cadenas de caracteres:ySe mantendrá una tabla hash con la codificación de cada vérticeyLos códigos se asignan internamente con valores entre 0 y el

número de v értices menos 1, conforme se va leyendo el grafo

D

C

A

B

E

0

1

2

3

4

DICCIONARIO

Page 14: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

14

Grafos. EDA. Curso 2003/0440

La implementación del diccionario

class ElementoHash implements Hashable {

String nombre;

int codigo;

public ElementoHash (String nom) {nombre=nom;

}public int hash () {

return ExploracionTablaCuadratica.hash(nombre);}public boolean equals (Object x) {

return nombre.equals( ((ElementoHash)x).nombre );}

}

Grafos. EDA. Curso 2003/0441

La clase Vertice

public class Vertice {String nombre; //el nombre del vérticeLista ady; // la lista de vértices adyacentes (aristas)

public Vertice(String v) {nombre=v;ady=new Lista();

}

public String toString() {return ady.toString();

}}

Grafos. EDA. Curso 2003/0442

La clase Grafo

public class Grafo {

private Vertice tabla [];private int numVertices;private TablaHash diccio;

public Grafo(int N) { ... }

public insArista (String orig,String dest,int cost) { ... }

public String toString() { ... }

}

Page 15: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

15

Grafos. EDA. Curso 2003/0443

El método constructor de Grafo

public Grafo() {numVertices=0;

tabla=new Vertice[TAMANYO_INICIAL];

diccio=new ExploracionTablaCuadratica();}

Grafos. EDA. Curso 2003/0444

La operaci ón insArista

public void insArista (String orig, String dest, int cost) {int codOrig=insNodo(orig);

int codDest=insNodo(dest);

LEIListaConPI aux=tabla[codOrig].ady;

aux.insertar(new Arista(codDest,cost));}

Grafos. EDA. Curso 2003/0445

La codificación de los vértices

private int insNodo (String nomVertice) {ElementoHash aux = new ElementoHash(nomVertice);ElementoHash res;

try {res= (ElementoHash) diccio.buscar(aux);return res.codigo; //Si ya está en el diccionario devolvemos su código

}catch (ElementoNoEncontrado e) {// Si no está, la añadimos al diccionario e incrementamos numVertices// Si fuera necesario se duplica la tabla de vérticesaux.codigo=numVertices;

diccio.insertar(aux);if (numVertices==tabla.length)

duplicarvectorTabla();tabla[numVertices]=new Vertice(aux.nombre);return numVertices++;

}}

Page 16: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

16

Grafos. EDA. Curso 2003/0446

4 Algoritmos de recorrido de grafos

zDFS: recorrido en profundidad (Depth First Search), generalización del recorrido en preorden de un árbol.

z BFS: recorrido en anchura (Breath First Search), generalización del recorrido por niveles de un árbol.

Grafos. EDA. Curso 2003/0447

Recorrido en profundidad (DFS)

z Explora sistemáticamente las aristas del grafo de forma que primero se visitan los v értices adyacentes a los visitados más recientemente. Así se va “profundizando” en el grafo.

z Algoritmo de recorrido en profundidad:y Contador ( ordenRecorrido)y Vector de naturales (R) para “ marcar” los vértices ya visitados (R[v]>0) y

almacenar el orden de recorrido. R[v]: orden en el que se visita el vértice v.

Grafos. EDA. Curso 2003/0448

Algoritmo de Recorrido en profundidad

Recorrido en ProfundidadordenRecorido=0; ∀v∈V: R[v]=0; ∀v∈V: Si (R[v]==0) entonces DFS(v) R mantiene el orden de recorrido

finRP

Método privado recursivoDFS(v)

ordenRecorrido++; R[v]=ordenRecorrido;∀w∈Adyacentes(v): Si (R[w]==0) entonces DFS(w)

Page 17: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

17

Grafos. EDA. Curso 2003/0449

Ejemplo: Recorrido DFS

27

3

1

5

4

9

8

6

Nodos Rv/w 1 2 3 4 5 6 7 8 9

0 0 0 0 0 0 0 0 01/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 - - - - - - - - 9R 1 2 3 7 8 4 5 6 9

Grafos. EDA. Curso 2003/0450

Recorrido en profundidad en Java

int R[];int OrdenRecorrido;public void RecorridoEnProfundidad () {

R=new int[numVertices];OrdenRecorrido=1;for (int i=0;i<numVertices;i++) R[i]=0;for (int i=0; i<numVertices; i++) if (R[i]==0) DFS(i);

} private void DFS (int i) {

LEIListaConPI b=tabla[i]. ady;R[i]=OrdenRecorrido++;b.inicio();b.recuperar();while (!b.esFin()) {

Arista w=(Arista) b.recuperar();if (r[w.dest]==0) DFS(w.dest);b.siguiente();

}}

Grafos. EDA. Curso 2003/0451

Ejercicio:

zHacer una traza del recorrido en profundidad sobre el grafo siguiente:

⌧V0 V1⌧V0 V3⌧V1 V3⌧V1 V4⌧V2 V0⌧V2 V5⌧V3 V4⌧V3 V5⌧V3 V6⌧V4 V6⌧V6 V5

Page 18: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

18

Grafos. EDA. Curso 2003/0452

Recorrido en anchura (BFS)

z Explora sistemáticamente las aristas del grafo de forma que primero se visitan los v értices más “cercanos” al que estamos explorando.

z Algoritmo de recorrido en anchura:y Contador (OrdenRecorrido)y Vector de naturales (R) para “ marcar” los vértices ya visitados (R[v]>0) y

almacenar el orden de recorrido.y Cola (Q) para gestionar los vértices no visitados

Grafos. EDA. Curso 2003/0453

Algoritmo de Recorrido en anchura

Recorrido en AmplitudOrdenRecorrido=0; ∀ v∈V: R[v]=0; Q=new ColaEnlazada ();∀v∈V: Si R[v]==0 entonces BFS(v) R mantiene el orden de recorrido

Método privado para el recorrido en AmplitudBFS(v)

OrdenRecorrido++; R[v]=OrdenRecorrido;Q.encolar(v);mientras (!Q.esVacia()) {

u=Q.desencolar();∀w∈Adyacentes(u): Si R[w]==0 {

OrdenRecorrido++; R[w]=OrdenRecorrido; Q.encolar(w) }

finBFS

Grafos. EDA. Curso 2003/0454

Ejemplo: Recorrido BFS

27

3

1

5

4

9

8

6

Nodos R Qv u w 1 2 3 4 5 6 7 8 9

1 1 0 0 0 0 0 0 0 0 <1>1 - - - - - - - - - <>

2 - 2 - - - - - - - <2>3 - - 3 - - - - - - <2,3>4 - - - 4 - - - - - <2,3,4>5 - - - - 5 - - - - <2,3,4,5>

2 - - - - - - - - - <3,4,5>3 - - - - - - - - - <4,5>

2 - - - - - - - - - --6 - - - - - 6 - - - <4,5,6>8 - - - - - - - 7 - <4,5,6,8>

4 - - - - - - - - - <5,6,8>3 - - - - - - - - - --8 - - - - - - - - - --

5 - - - - - - - - - <6,8>6 - - - - - - - - - <8>

7 - - - - - - 8 - - <8,7>8 - - - - - - - - - <7>

6 - - - - - - - - - --7 - - - - - - - - - <>

9 - - - - - - - - 9 <9>9 - - - - - - - - - <>

5 - - - - - - - - - --8 - - - - - - - - - --

R 1 2 3 4 5 6 8 7 9

Page 19: Grafos - personales.upv.espersonales.upv.es/prosso/Grafos.pdf · 10/05/2005 2 Grafos. EDA. Curso 2003/04 4 BIBLIOGRAFÍA Básica: zWeiss, M.A. Estructuras de datos en Java. Adisson-Wesley,

10/05/2005

19

Grafos. EDA. Curso 2003/0455

2.5 Orden topológico en grafos dirigidos acíclicos

z En un grafo dirigido acíclico el recorrido en profundidad puede utilizarse directamente para ordenar los v értices según un orden (parcial) “p “ tal que u,v∈V, si (u,v)∈E, upv. Basta ir anotando en una pila global (P) los vértices completamente explorados por DFS.

Grafos. EDA. Curso 2003/0456

Algoritmo de Ordenación Topológica

OTP(G)n:=0; ∀v∈V: Rv:=0; fin∀; creap(P);∀v∈V: Si Rv=0 entonces DFS(v) fin∀devolver (R)

finRP

DFS(v)n:=n+1; Rv:=n;∀w∈Adyacentes(v): Si Rw=0 entonces DFS(w) fin∀;apilar(P,v)

finDFS

Grafos. EDA. Curso 2003/0457

Ejemplo: Ordenación topológica

27

3

1

5

4

9

8

6

Nodos R Pv/w 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 - - - - - - - <2>3/2,6,8 - - 3 - - - - - - <2>

6/7 - - - - - 4 - - - <2> 7/2 - - - - - - 5 - - <7,2>

--- - - - - - - - - - <6,7,2>8/6 - - - - - - - 6 - <8,6,7,2>

--- - - - - - - - - - <3,8,6,7,2>4/3,8 - - - 7 - - - - - <4,3,8,6,7,2>5/- - - - - 8 - - - - <5,4,3,8,6,7,2>

--- - - - - - - - - - <1,5,4,3,8,6,7,2>9/5,8 - - - - - - - - 9 <9,1,5,4,3,8,6,7,2>

9 1 5 4 3 8 6 7 2 Grafo ordenado topológicamente