Está en la página 1de 15

Recorrido en profundidad (I)

Estrategia que emplea: primero visitar los hijos y luego los hermanos.
1. 2. 3. 4.

Tratar nodo Seleccionar adyacente no tratado Recorrer en profundidad el nodo no tratado Volver al punto 2

Es similar al recorrido preorden de los rboles. A partir de un nodo inicial, se siguen los arcos visitando el mayor nmero de nodos posible. Es necesario llevar control de los nodos ya visitados.
M del Puerto Paule Ruiz

Recorrido en profundidad (II)


public void bfp(int i){ marca[i]=true; Tratar(i); for cada w con acceso directo desde i if (! marca[w] ) bfp(w); } Ejemplo 14
M del Puerto Paule Ruiz

Recorrido en profundidad (III)


Garantizar el recorrido completo del grafo:
boolean marcar []=new boolean [n]; public void profundidad(){ for (int i=0;i<n;i++){ marcar[i]=false; } for (int i=0;i<n;i++) if (!marcar[i]) bfp(i); }
M del Puerto Paule Ruiz

Recorrido en profundidad (IV)

Complejidades

Matrices de adyacencias: Caso mejor O(n) Caso peor O(n) Lista de adyacencias Caso mejor: O(1) Caso peor : O(n)

M del Puerto Paule Ruiz

Recorrido en Profundidad (V)

Recorrido Primero en Profundidad


Caso particular del recorrido en profundidad en donde el recorrido se para al encontrar un nodo que cumple una determinada condicin Modificar el cdigo de Recorrido en profundidad para que se comporte como Recorrido Primero en Profundidad

Ejercicio:

M del Puerto Paule Ruiz

Recorrido en Profundidad (VI)


public void primeroenprofundidad(int i){ boolean para=false; marca [i]=true; Tratar(i); if (condicion) para=true; while (!para) && queda w accesible desde i if (!marca[w]) primeroenprofundidad (w); }

M del Puerto Paule Ruiz

Recorrido en Anchura(I)
Recorrer antes los hermanos y luego los hijos.
1. 2.

Tratar nodo Tratar sucesores del nodo no marcados

Se utiliza una cola para implementar este recorrido:


1. 2. 3. 4. 5.

Meter elemento en la cola Sacar elemento de la cola Meter adyacentes Tratar elemento Hacer pasos 2, 3 y 4 mientras la cola no quede vacia
M del Puerto Paule Ruiz

Recorrido en Anchura (II)


public void recorridoenanchura(int i){ marca[i]=true; cola.meter(i); while (!cola.vacia()) { nodo=cola.sacar(); tratar(nodo); for cada sucesor k de nodo i if (!marca[k]){ marca[k]=true; cola.meter(k); } } }
M del Puerto Paule Ruiz

Recorrido en Anchura (III)


Garantizar que se hace un recorrido completo de todo el grafo.
boolean marcar[]=new boolean [n]; public void anchura(){ for (int i=0;i<n;i++){ marcar[i]=false; } for (int i=0;i<n;i++) if (!marcar[i])recorridoenanchura(i); } Ejemplo 15
M del Puerto Paule Ruiz

Recorrido en Anchura (IV)

Complejidades

Matrices de adyacencias Caso mejor O(n) Caso peor O(n) Lista de adyacencias Caso mejor O(1) Caso peor O(n)

M del Puerto Paule Ruiz

Recorrido primero en Anchura

Parada del algoritmo recorrido en Anchura cuando encontramos un nodo que cumpla una condicin. Ejercicio:

Modificar el Recorrido en Anchura para que se comporte como Recorrido Primero en Anchura

M del Puerto Paule Ruiz

Recorrido primero en Anchura .....


parar=false; while (!cola.vacia() && !parar) { nodo=cola.sacar(); tratar(nodo); parar=condicion(nodo); if (!parar){ para cada sucesor k de nodo .... } Nota importante: Se debe vaciar la cola al final (dependiendo del lenguaje)
M del Puerto Paule Ruiz

Grafos Dirigidos Acclicos (I) (DAG)


Es un grafo dirigido sin ciclos. Utilidad: Representa relaciones de precedencia entre nodos:

Precedencia de operadores en operaciones aritmticas Relaciones de orden Representacin de actividades

En estos grafos es necesario realizar un test de aciclicidad:


Obtener la matriz de caminos y verificar que no existe ningn elemento VERDADERO en la diagonal principal: Warshall
M del Puerto Paule Ruiz

DAG (II)
Ejemplo de DAG:
1. 2. 3. 4. 5.

Modelizar la construccin de un puente: Construir cimientos Construir columnas Transportar y colocar columnas Colocar vigas Poner piso Para realizar esto hay que seguir un orden:

1->3->4->5 2->3->4->5

M del Puerto Paule Ruiz

Orden Topolgico (I)

Objetivo: Disponer los vrtices de un grafo dirigido acclico de tal forma que si hay un camino de u a v, entonces v debe de aparecer despus de u.

Se escribe de forma lineal el orden a recorrer del grafo partiendo desde un nodo cualquiera hasta el nodo sumidero.

M del Puerto Paule Ruiz

Orden Topolgico (II)

public void ordenTop(int i){ marca [i]=true; for cada nodo w sucesor de i if (!marca [w]) ordenTop(w) ; Tratar(i); } Ejemplo 16

M del Puerto Paule Ruiz

Orden Topolgico (III)


Salida Lineal: Calcular el orden topolgico de todos los nodos: Salida Lineal I public void ordenTopTotal(){ if (grafoAciclico){ for (int i=0;i<n;i++){ for (int j=0;j<n;j++) marca[j]=false; ordenTop(i); } } System.out.println(Grafo no Acclico); } Ejemplo 17
M del Puerto Paule Ruiz

Orden Topolgico (IV)

Salida Lineal II

Encontrar un vrtice v que slo tenga aristas de entrada. Imprimir ese vrtice Borrarlo (lgicamente) del grafo junto sus aristas Aplicar la misma estrategia al resto de los nodos del grafo

Ejemplo 18

M del Puerto Paule Ruiz

Grafos no dirigidos (I)

Se pueden representar como grafos dirigidos en donde cada arista se representa mediante un arco de ida y vuelta Las representaciones en memoria (matrices de adyacencias y listas de adyacencias) se pueden utilizar.

M del Puerto Paule Ruiz

Grafos no dirigidos (II)


Simetra con respecto a la diagonal principal en las matrices de adyacencias. Necesidad de optimizar la memoria Ejemplo 19 Canto se ahorra de memoria? Supongamos lo siguiente: boolean aristas=new boolean[Max][Max]; boolean aristasplust=new boolean[nMax]; nMax=1+2+3++Max=(Max+Max)/2 Ahorro de memoria: Max-(Max+Max)/2=(Max-Max)/2 Se ahorra un poco ms de la mitad de la memoria original Se ha de aplicar el mismo esquema de almacenamiento para el resto de las matrices (pesos, caminos, etc)
M del Puerto Paule Ruiz

Arboles libres

Definicin:

Grafo conexo sin ciclos Todo rbol libre con n>=1 nodos tiene n-1 aristas Si se aade cualquier arista, sta forma parte de un ciclo (el grafo deja de ser rbol libre) Para cualquier par de nodos, slo hay un camino simple

Propiedades:

Ejemplo 20

M del Puerto Paule Ruiz

Definiciones

Arbol libre abarcador:


Arbol libre que conecta todos los nodos del grafo

Ejemplo 21 Arbol libre abarcador de coste mnimo:


Aquel en el que la suma de los pesos de sus aristas es la mnima posible

M del Puerto Paule Ruiz

rboles libres abarcadores de coste mnimo


Objetivo:

Obtener el coste mnimo


Estrategias
Generar todos los rboles abarcadores, evaluar su coste y quedarnos con aquel que tiene coste mnimo. Esta estrategia dara lugar a un algoritmo NP Conseguir el coste mnimo con mejor complejidad: Prim y Kruskal

M del Puerto Paule Ruiz

Prim (I)
Objetivo: Dado un nodo de un grafo, determinar un rbol abarcador de coste mnimo Estrategia: Similar a la de Dijkstra: Partiendo de un grafo formado por un solo nodo (conjunto U) se van aadiendo nodos en cada iteraccin En cada iteraccin: Se examina el coste de todas las arista {u,v} en donde u pertenece a U y v no pertenece a U De todas las aristas {u,v} se selecciona aquella de coste mnimo, aadiendo v a U El algoritmo termina cuando U incluye todos los nodos del grafo.

M del Puerto Paule Ruiz

Prim (II)
public void Prim(objetoNodo v){ T= vacio; //conjunto de aristas de coste //mnimo U= v; //nodo de partida while U!=V { elegir arista {u,v} de mnimo coste tal que u pertenezca a U y v pertenezca a V-U T=T+{u,v} U=U+v; } } Ejemplo 23 y 24
M del Puerto Paule Ruiz

Prim (III)

Evaluacin:

El bucle principal (while U=!V) se realiza n-1 veces Bsqueda de la arista de menor coste O(n) si se emplean vectores auxiliares Si no se emplean dos vectores es una bsqueda con complejidad O(n) La complejidad de Prim: O(n) O(n)

El rbol libre abarcador resultante depende del nodo de partida.

M del Puerto Paule Ruiz

Kruskal (I)
Objetivo: El mismo que Prim Estrategia Se trata de un grafo formado por n componentes conexas (todos los nodos del grafo sin las aristas) En cada iteracin se selecciona una arista {u,v} y se aade a un conjunto T de aristas. Se van seleccionando aristas {u,v} en la que no formen parte de alguna componente conexa. Se trata de aristas que pueden conectar dos componentes conexas De todas las arista {u,v} se coge aquella de coste mnimo, aadindola al conjunto de aristas T. El algoritmo termina cuando hay slo una nica componente conexa.
M del Puerto Paule Ruiz

Kruskal (II)
public void Kruskal{ T= vacio; //conjunto de aristas de coste mnimo Construir una cola de prioridad P con las aristas while T.numElementos < n { {u,v}=P.sacarminimo if (u,v) une dos componentes conexas sin formar ciclos T=T+{u,v} } } Ejemplo 25 y 26

M del Puerto Paule Ruiz

Kruskal (III)
El algoritmo se realiza a veces (siendo a el nmero de aristas). Extraer la arista de coste mnimo de la cola de prioridad y reorganizarla log2a Complejidad de Kruskal: alog2a. La eleccin entre Prim o Kruskal depende de la densidad del grafo: Si el grafo es poco denso (a se aproxima a n) entonces: Prim: O(n) Kruskal: nlog2n Si el grafo es denso (a se aproxima a n) entonces: Prim:O(n) Kruskal: nlog2n
M del Puerto Paule Ruiz

Bibliografa

Weiss, M.A. Estructuras de datos en Java. Gonzlez Rodrguez, Martn. Arboles. Coleccin de Cuadernos Didcticos en Ingeniera Informtica Nmero 28. Editorial Servitec. 2001

M del Puerto Paule Ruiz

También podría gustarte