Está en la página 1de 21

Floyd (V)

• Ejemplo 10
• Ejemplo 11
• Ejercicio:
„ Realizar un método que recupere los caminos en la
matriz P de Floyd

Mª del Puerto Paule Ruiz

Floyd (VI) –Recuperación de caminos


public void trayectoria (int i,int j)
{
k=P[i][j];
if (k!=0){
trayectoria (i,k);
tratar (k);
trayectoria (k,j);
}
public void camino (int i,int j)
{
tratar (i)
trayectoria (i,j);
tratar(j);

}
Mª del Puerto Paule Ruiz
Floyd (VII)

• Se pueden hacer las pasadas directamente sobre


la matriz A sin necesidad de utilizar memoria
adicional por:
„ En la fila k se encuentran los costes mínimos con
origen vk
„ En la columna k se encuentra los costes mínimos
con destino vk
„ Es imposible que se modifiquen valores en los que
vk ya está incorporado (como origen o destino)
„ Las celdas vk implicadas se usan para lectura pero
no para escritura.

Mª del Puerto Paule Ruiz

Floyd (VIII)

• Ejercicio:
„ Modificar Floyd para calcular los caminos de coste
mínimo empleando solamente los nodos
pertenecientes a un conjunto L

Mª del Puerto Paule Ruiz


Floyd (IX)
[…]
for (int k=0;k<n;k++)
if (k pertenece a L ){
for (int i=0;i<n;i++)
for (int j=0;j<n;j++){
ck=A[i][k]+A[k][j];
if (ck<A[i][j]) {
A[i][j]=ck; //0(n3)
P[i][j]=k;
}
}
}
Mª del Puerto Paule Ruiz

Floyd (X)-Complejidades

• Floyd no funciona con costes negativos.


• La complejidad con matrices de adyacencias es
0(n³)
„ Resolviendo el mismo problema, Dijkstra y Floyd
presentan la complejidad de O(n³)
„ Si el número de aristas (a) es pequeño, la versión
con colas de prioridad con Dijkstra es más
eficiente: O(anlog2n)
„ Si a tiende a n Æ O(n² log2n)
„ Si a tiende a n² Æ O(n³ log2n)

Mª del Puerto Paule Ruiz


Floyd (XI)-Aplicaciones

• Cálculo del Centro de un grafo


„ Centro de un grafo es aquel nodo más cercano al
nodo más distante.
z Centro de un grafo es el nodo de mínima
excentricidad.
z Excentricidad de un nodo v es el máximo de los
costes de todos los caminos con destino v.
• Ejemplo 12

Mª del Puerto Paule Ruiz

Warshall

• Objetivo:
„ Determinar si existe camino entre cualquier par de
nodos del grafo
• Funciona prácticamente igual que Floyd.
• Matriz de caminos A: Para cada elemento i,j de la
matriz:
„ 1/trueÆ si existe camino directo entre (i,j)
„ 0/falseÆ si no existe
• Esta matriz A se conoce como el cierre transitivo
de un grafo

Mª del Puerto Paule Ruiz


Warshall (II)

• Se aplican n-iteracciones sobre la matriz A


• En la iteracción k-ésima
„ Ak(i,j)=1 /true cuando:

z Existe camino entre vi y vj

— ÆAk-1(i,j)=1
z Existe camino simple entre vi y vk y otro camino entre
vk y vj que no empleé otros nodos a aparte de
v1...vk-1.
— ÆAk-1(i,k)=1 Y Ak-1(k,j)=1
„ Juntándolo todo:

z Ak(i,j)=Ak-1(i,j) OR Ak-1(i,k) AND Ak-1(k,j)

Mª del Puerto Paule Ruiz

Warshall (III)

public void Warshall{


for (int i=0;i<n;i++)
for (int j=0;j<n;j++) //0(n²)
A[i][j]=Aristas[i][j];

for (int k=0;k<n;k++)


for (i=0;i<n;i++) //0(n³)
for (j=0;j<n;j++)
A[i][j]=A[i][j] || (A[i][k] && A[k][j]);

Mª del Puerto Paule Ruiz


Warshall (IV)

• Ejemplo 13
• Complejidad : O(n³)
• El cierre transitivo se puede determinar aplicando
Floyd y luego haciendo falso las casillas con coste
infinito

Mª del Puerto Paule Ruiz

Recorrido en profundidad (I)

• Estrategia que emplea: primero visitar los hijos y


luego los hermanos.
1. Tratar nodo
2. Seleccionar adyacente no tratado
3. Recorrer en profundidad el nodo no tratado
4. 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 número 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 marca []=new boolean [n];
public void profundidad(){
for (int i=0;i<n;i++){
marca[i]=false;
}
for (int i=0;i<n;i++)
if (!marca[i]) bfp(i);

Mª del Puerto Paule Ruiz


Recorrido en profundidad (IV)

• Complejidades
„ Matrices de adyacencias:
z Caso mejor O(n)

z Caso peor O(n²)

„ Lista de adyacencias
z Caso mejor: O(1)

z 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 condición
• Ejercicio:
„ Modificar el código de Recorrido en profundidad
para que se comporte como Recorrido Primero en
Profundidad

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. Tratar nodo
2. Tratar sucesores del nodo no marcados
• Se utiliza una cola para implementar este
recorrido:
1. Meter elemento en la cola
2. Sacar elemento de la cola
3. Meter adyacentes
4. Tratar elemento
5. 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 marca[]=new boolean [n];
public void anchura(){
for (int i=0;i<n;i++){
marca[i]=false;
}
for (int i=0;i<n;i++)
if (!marca[i])recorridoenanchura(i);
}
• Ejemplo 15

Mª del Puerto Paule Ruiz


Recorrido en Anchura (IV)

• Complejidades
„ Matrices de adyacencias
z Caso mejor O(n)

z Caso peor O(n²)

„ Lista de adyacencias
z Caso mejor O(1)

z 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 condición.
• 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 Acíclicos (I) (DAG)


• Es un grafo dirigido sin ciclos.
• Utilidad: Representa relaciones de precedencia
entre nodos:
„ Precedencia de operadores en operaciones
aritméticas
„ Relaciones de orden
„ Representación de actividades
• En estos grafos es necesario realizar un test de
aciclicidad:
„ Obtener la matriz de caminos y verificar que no
existe ningún elemento VERDADERO en la diagonal
principal:
z Warshall

Mª del Puerto Paule Ruiz


DAG (II)

• Ejemplo de DAG:
„ Modelizar la construcción de un puente:
1. Construir cimientos
2. Construir columnas
3. Transportar y colocar columnas
4. Colocar vigas
5. Poner piso
„ Para realizar esto hay que seguir un orden:
1->3->4->5
2->3->4->5

Mª del Puerto Paule Ruiz

Orden Topológico (I)

• Objetivo: Disponer los vértices de un grafo


dirigido acíclico de tal forma que si hay un camino
de u a v, entonces v debe de aparecer después
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 Topológico (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 Topológico (III)


• Salida Lineal: Calcular el orden topológico 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 Acíclico”);
}
Ejemplo 17

Mª del Puerto Paule Ruiz


Orden Topológico (IV)

• Salida Lineal II
„ Encontrar un vértice v que sólo tenga aristas de
entrada.
„ Imprimir ese vértice
„ Borrarlo (lógicamente) 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)
• Simetría con respecto a la diagonal principal en las
matrices de adyacencias.
• Necesidad de optimizar la memoria
• Ejemplo 19
• Cúanto 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:

z Max²-(Max²+Max)/2=(Max²-Max)/2

Se ahorra un poco más 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

• Definición:
„ Grafo conexo sin ciclos
• Propiedades:
„ Todo árbol libre con n>=1 nodos tiene n-1 aristas
„ Si se añade cualquier arista, ésta forma parte de
un ciclo (el grafo deja de ser árbol libre)
„ Para cualquier par de nodos, sólo hay un camino
simple
• 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 mínimo:
„ Aquel en el que la suma de los pesos de sus aristas
es la mínima posible

Mª del Puerto Paule Ruiz

Árboles libres abarcadores de coste


mínimo

• Objetivo:
„ Obtener el coste mínimo
• Estrategias
z Generar todos los árboles abarcadores, evaluar
su coste y quedarnos con aquel que tiene coste
mínimo.
—Esta estrategia daría lugar a un algoritmo NP
z Conseguir el coste mínimo 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 mínimo


• Estrategia:
„ Similar a la de Dijkstra:

„ Partiendo de un grafo formado por un solo nodo

(conjunto U) se van añadiendo nodos en cada iteracción


„ En cada iteracción:

z Se examina el coste de todas las arista {u,v} en


donde u pertenece a U y v no pertenece a U
z De todas las aristas {u,v} se selecciona aquella de
coste mínimo, añadiendo 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
//mínimo
U= v; //nodo de partida
while U!=V {
elegir arista {u,v} de mínimo 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)

• Evaluación:
„ El bucle principal (while U=!V) se realiza n-1 veces
z Búsqueda de la arista de menor coste Æ O(n) si
se emplean vectores auxiliares
z Si no se emplean dos vectores es una búsqueda
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 iteración se selecciona una arista {u,v} y se
añade a un conjunto T de aristas.
z 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
mínimo, añadiéndola al conjunto de aristas T.
„ El algoritmo termina cuando hay sólo una única
componente conexa.

Mª del Puerto Paule Ruiz


Kruskal (II)
public void Kruskal{
T= vacio; //conjunto de aristas de coste
mínimo
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 número de


aristas).
„ Extraer la arista de coste mínimo de la cola de
prioridad y reorganizarla log2a
„ Complejidad de Kruskal: alog2a.

• La elección entre Prim o Kruskal depende de la densidad


del grafo:
„ Si el grafo es poco denso (a se aproxima a n)
entonces:
z Prim: O(n²)

z Kruskal: nlog2n

„ Si el grafo es denso (a se aproxima a n²) entonces:

z Prim:O(n²)

z Kruskal: n²log2n

Mª del Puerto Paule Ruiz


Bibliografía

• Weiss, M.A. Estructuras de datos en


Java.
• González Rodríguez, Martín. Arboles.
Colección de Cuadernos Didácticos en
Ingeniería Informática Número 28.
Editorial Servitec. 2001

Mª del Puerto Paule Ruiz

También podría gustarte