Tema 9: GRAFOSTercera Parte
Estructuras de Datos y AlgoritmosCurso 2002/03
Grafos. EDA. Curso 2002/032
SubgrafosConectividadÁrbolesÁrboles de recubrimiento
Conceptos sobre grafos
Problema ARCM: dado un grafo no dirigido y ponderado,encontrar un árbol de recubrimiento de coste mínimo
Soluciones:
Algoritmo de Kruskal
Algoritmo de Prim
MFSET: estructura deconjuntos disjuntos
Grafos. EDA. Curso 2002/033
Subgrafos
Un Grafo G’=(V’,E’) es un subgrafo de G=(V,E) si:• V’ V• E’ E
Dado un conjunto V’ V, el subgrafo de G inducido por V’ es
G’=(V’,E’) : E’ = { (u,v) E : u,v V’ }
Ejemplo: el subgrafo inducido por V’ = {1, 2, 3, 6 } es …
1 2 3
5 64
1 2 3
6
Grafos. EDA. Curso 2002/034
Conectividad de un grafo
Un gnd es conexo si cualquier par de vértices están conectados por uncamino
Las componentes conexas de un Grafo son las clases de equivalencia enV definidas por la relación R = “es alcanzable desde”
Ejemplo: las componentes conexas del Grafo son ...
1 2 3
5 64
Grafos. EDA. Curso 2002/035
Árboles
Un Grafo no dirigido Acíclico y conexo es un Árbol (libre)
GrafoÁrbol(libre)Bosque
Un Grafo no dirigido Acíclico es un Bosque
Grafos. EDA. Curso 2002/036
Árboles
TEOREMA: sea G=(V,E) un gnd. Las siguientes afirmaciones son equivalentes:• G es un Árbol (libre)• cualquier par de Vértices en G están conectados por un único caminosimple• G es conexo y |E| = |V| - 1• G es acíclico pero si añadimos una Arista a E, el Grafo resultantecontiene un ciclo
Demostración en Cormen, págs. 1085-1087
Un Árbol con raíz es un Árbol (libre) con un Vértice distinguidodenominado raíz
Grafos. EDA. Curso 2002/037
Árbol de recubrimiento (Spanning Tree) de un gnd
Un Árbol de recubrimiento del Grafo G=(V,E) es un Árbol Libre T=(V’,E’)tal que:
• V ’ V• E’ E
Ejemplo: interconectar N pin’s con N - 1 cables, cada uno de loscuales conecta 2 pin’s, utilizando la menor cantidad de cable posible
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
G=(V,E) ponderado con:• |V| = N = 9
• |E| = 13
T=(V’,E’) con:• V’ V, |V’|=N=9
• E’ E, |E’|=N-1=8con Peso mínimocon Peso mínimo
a
b
Grafos. EDA. Curso 2002/038
Árbol de recubrimiento (Spanning Tree) de un gnd
Ejemplo: interconectar N pin’s con N - 1 cables, cada uno de loscuales conecta 2 pin’s, utilizando la menor cantidad de cable posible
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
G=(V,E) ponderado con:• |V| = N = 9
• |E| = 13
T=(V’,E’) con:• V’ V, |V’|=N=9
• E’ E, |E’|=N-1=8con Peso mínimocon Peso mínimo
a
b c
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
a
b
h
Grafos. EDA. Curso 2002/039
Árbol de recubrimiento (Spanning Tree) de un gnd
Ejemplo: interconectar N pin’s con N - 1 cables, cada uno de loscuales conecta 2 pin’s, utilizando la menor cantidad de cable posible
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
G=(V,E) ponderado con:• |V| = N = 9
• |E| = 13
T=(V’,E’) con:• V’ V, |V’|=N=9
• E’ E, |E’|=N-1=8con Peso mínimocon Peso mínimo
a
b c
i
fg h
d
e
E’= { a,b), b,c), c,i), c,f), f,g), g,h), c,d), d,e) }
con Peso mínimo 37
Grafos. EDA. Curso 2002/0310
Problema ARCM
Dado un grafo no dirigidono dirigido y conexoconexo G=(V,E), yponderadoponderado con p:E R+
Encontrar T E:• G’=(V,T) es un subgrafo conexo y acíclico de (V,E)• la suma de los pesos de los arcos de T sea mínima
•T es acíclico, conexo y no dirigido, entonces es un árbolárbol•Se debe extenderextender por todos los vértices•La suma de los pesos de sus arcos debe ser mínimamínima
Árbol de extensión de coste mínimoÁrbol de extensión de coste mínimo
Grafos. EDA. Curso 2002/0311
Problema ARCM
Árbol RCM Dado un gnd G=(V,E), un AEM es un árbol libreT=(V’,E’) tal que V’=V y E’ E.Definición del problema: Dado un gnd ponderadoG=(V,E,p), encontrar un AEM de G, T=(V’,E’) , tal que lasuma de los pesos de las |V|-1 aristas de T sea mínimo.
b
a
e
c d6
4
3
98
1
2456
b
a
e
c d6
4
3
98
1
2456
Grafos. EDA. Curso 2002/0312
Algoritmo de Kruskal: Idea Voraz
Construir incrementalmente un bosque (de extensión orecubrimiento), seleccionando en cada paso una arista(u,v) de E tal que:
No se cree ningún cicloProduzca el menor incremento de peso posible.El árbol de recubrimiento o extensión se obtiene cuando se hanseleccionado exactamente |V|-1 aristas válidas.
Grafos. EDA. Curso 2002/0313
Algoritmo de Kruskal. Versión básica
Kruskal_0(V,E,p)E’= ;while (|E’|<|V|-1) {
(u,v)=argmin (x,y) E-E’ p(x,y);if (u,v) no crea ciclo en E’ entonces E’=E’ {(u,v)}
}devuelve (E’);
Grafos. EDA. Curso 2002/0314
Algoritmo de KRUSKAL (ejemplo)
7
21 3
54 6
1 2
4 6 4 5 6
3 8
47
3
Grafos. EDA. Curso 2002/0315
Algoritmo de KRUSKAL. EjemploAlgoritmo de KRUSKAL. Ejemplo
7
21 3
54 6
Arcos por orden creciente de pesos:{(1,2), (2,3), (4,5), (6,7), (1,4), (2,5), (4,7), (3,5), (2,4), (3,6), (5,7) (5,6)}
Grafos. EDA. Curso 2002/0316
Algoritmo de Kruskal (i)
Kruskal_0(V,E,p)E’= ;while (|E’|<|V|-1) {
(u,v)=argmin (x,y) E-E’ p(x,y);if (u,v) no crea ciclo en E’ entonces E’=E’ {(u,v)}
}devuelve (E’); Problema: ¿Cómo verificar de forma
eficiente la condición de “no crear ciclo”?
Problema: ¿Cómo seleccionar de formaeficiente la arista de menor peso en cadaiteración?
Grafos. EDA. Curso 2002/0317
Algoritmo de Kruskal (ii)
Problema: ¿Cómo verificar eficientemente la condición de“no crear ciclo”?
Solución: Mantener una colección de conjuntos disjuntos (uno porcada árbol del bosque): una arista (u,v) no creará ciclo si u y vestán en distintos subconjuntos. Estructurar el conjunto dearistas seleccionadas como un MFSet de vértices.
Problema: ¿Cómo seleccionar eficientemente la arista demenor peso en cada iteración?
Solución: Ordenar todas las aristas en orden creciente de suspesosSolución: Mantener las aristas en un MinHeap ordenado según lospesos de las mismas.
Grafos. EDA. Curso 2002/0318
Algoritmo de Kruskal (iii)
Kruskal (V,E,p)E’= ;for cada v V hacer Constuir_Cjto(v);H=ConstuirHeap(A,p);while (|E’|<|V|-1) {
(u,v)=EliminaMin(H);if (Encuentra(u) Encuentra(v)) entonces
E’=E’ {(u,v)};Combina(u,v);
}devuelve (E’);
Grafos. EDA. Curso 2002/0319
Algoritmo de Kruskal. Análisis de costes
Kruskal (V,E,p)E’= ;for v V hacer Constuir_Cjto(v);H=ConstuirHeap(A,p);while (|E’|<|V|-1){
(u,v)=EliminaMin(H);if (Encuentra(u) Encuentra(v)) entonces
E’=E’ {(u,v)};Combina(u,v);
}devuelve (E’);
O(|V|)
O(|E|)
|V|: número de vértices;|E|: número de arcos;
O(|E|) veces
O(log|E|)
O(1)O(1)
O(1)
Cota: O(|E|log|E|)Si m es el nº de iteraciones
m |V| y |V|<<|E| |V|2
O(|E|+|V|log|V|)
Grafos. EDA. Curso 2002/0320
E. de Datos para Conjuntos Disjuntos
Un MFSetMFSet (Merge-Find Set) es una estructura tipo conjuntoen la que
los elementos están organizados en subconjuntos disjuntos yel nº de elementos es fijo (no se añaden ni se borran).
Las operaciones características son:CombinaCombina: hace la unión de dos conjuntos disjuntos (Merge)EncuentraEncuentra: dado un elemento debe determinar a qué conjuntopertenece (Find)
Grafos. EDA. Curso 2002/0321
MFSets. Ejemplo
17
4
AB
5
610
8
C3 12
13 2
119
Aplicaciones:•Equivalencia entre autómatas finitos•Determinación de componentes conexas de un gnd•Obtención del AEM en un gnd
1 8 3
Grafos. EDA. Curso 2002/0322
Operaciones sobre MFSets
Si x e y son elementos (objetos) del conjunto:Construir_Construir_CjtoCjto(x):(x): crea un nuevo conjunto cuyo único miembro es x.
Combina(x,y):Combina(x,y): une los conjuntos a los que pertenecen x e y
Encuentra(x):Encuentra(x): devuelve la referencia al representante del conjunto alque pertenece x.
Grafos. EDA. Curso 2002/0323
Componentes conexas de un grafo
Sea G=(V,E) un grafo no dirigidoV es el conjunto de vérticesE es el conjunto de arcos
ComponentesConexas(G=(V,E)){v V hacer Construir_Cjto(v);(u,v) E hacer
if (Encuentra(u) Encuentra(v))entonces Combina(u,v);
}
Ejercicio: Implementar el algoritmo en Java
Grafos. EDA. Curso 2002/0324
Ejemplo
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0325
Ejemplo.Inicio
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0326
Ejemplo. Iteración 1
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
(b,d) {a} {b,d} {c} {e} {f} {g} {h} {i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0327
Ejemplo. Iteración 2
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
(b,d) {a} {b,d} {c} {e} {f} {g} {h} {i} {j}
(e,g) {a} {b,d} {c} {e,g} {f} {h} {i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0328
Ejemplo. Iteración 3
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
(b,d) {a} {b,d} {c} {e} {f} {g} {h} {i} {j}
(e,g) {a} {b,d} {c} {e,g} {f} {h} {i} {j}
(a,c) {a,c} {b,d} {e,g} {f} {h} {i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0329
Ejemplo. Iteración 4
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
(b,d) {a} {b,d} {c} {e} {f} {g} {h} {i} {j}
(e,g) {a} {b,d} {c} {e,g} {f} {h} {i} {j}
(a,c) {a,c} {b,d} {e,g} {f} {h} {i} {j}
(h,i) {a,c} {b,d} {e,g} {f} {h,i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0330
Ejemplo. Iteración 5
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
(b,d) {a} {b,d} {c} {e} {f} {g} {h} {i} {j}
(e,g) {a} {b,d} {c} {e,g} {f} {h} {i} {j}
(a,c) {a,c} {b,d} {e,g} {f} {h} {i} {j}
(h,i) {a,c} {b,d} {e,g} {f} {h,i} {j}
(a,b) {a,c,b,d} {e,g} {f} {h,i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0331
Ejemplo. Iteración 6
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
(b,d) {a} {b,d} {c} {e} {f} {g} {h} {i} {j}
(e,g) {a} {b,d} {c} {e,g} {f} {h} {i} {j}
(a,c) {a,c} {b,d} {e,g} {f} {h} {i} {j}
(h,i) {a,c} {b,d} {e,g} {f} {h,i} {j}
(a,b) {a,c,b,d} {e,g} {f} {h,i} {j}
(e,f) {a,c,b,d} {e,g,f} {h,i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0332
Ejemplo. Iteración 7
Arco Colección de conjuntos disjuntos{a} {b} {c} {d} {e} {f} {g} {h} {i} {j}
(b,d) {a} {b,d} {c} {e} {f} {g} {h} {i} {j}
(e,g) {a} {b,d} {c} {e,g} {f} {h} {i} {j}
(a,c) {a,c} {b,d} {e,g} {f} {h} {i} {j}
(h,i) {a,c} {b,d} {e,g} {f} {h,i} {j}
(a,b) {a,c,b,d} {e,g} {f} {h,i} {j}
(e,f) {a,c,b,d} {e,g,f} {h,i} {j}
(b,c) {a,c,b,d} {e,g,f} {h,i} {j}
a b
c d
e f
g
h
i
j
Grafos. EDA. Curso 2002/0333
Representación de un MFSet
La más sencilla...MFSet M=vector[1..N] de TipoNombreCjto;
N es el número de elementosM[x] es el conjunto al que pertenece x
OperacionesEncuentra(x): es un acceso a M[x], O(1)Combina(x,y): recorrido sobre el vector, O(N)
Coste amortizado:Una secuencia de N-1 operaciones combina tiene un coste O(N2)
Grafos. EDA. Curso 2002/0334
Ejemplo
{{1},{2},{3},{4},{5}}Combina(1,2)
{{1,2},{3},{4},{5}}Combina(2,3)
{{1,2,3},{4}{5}}Combina(3,4)
{{1,2,3,4},{5}}Combina(4,5){{1,2,3,4,5}}
1 2 3 4 5 1 2 3 4 5
1 1 3 4 5 1 2 3 4 5
1 1 1 4 5 1 2 3 4 5
1 1 1 1 5 1 2 3 4 5
1 1 1 1 1 1 2 3 4 5
Grafos. EDA. Curso 2002/0335
Coste Amortizado
Coste de N-1 operaciones de Combina O(N2)Si el número de operaciones Encuentra que se realiza essuperior a N2, el rendimiento de esta representación esbueno, ya que el coste de cada operación de Combina yEncuentra es O(1). Si hay menos búsquedas esta cota no esaceptable.Mejora: mantener todos los elementos del mismo conjuntoen una lista enlazadalista enlazada. No obstante el comportamientoasintótico sigue siendo el mismo.
Grafos. EDA. Curso 2002/0336
MFSet. Representación en árbol
Cada subconjunto es un árbol en el que cada nodo apunta alpadre.La raíz del árbol puede usarse para nombrar el conjunto.El MFSet estará representado por una colección deárboles (un bosquebosque).
3 5
14
7
6 9
82
10
3
5
1 7 4
8
6 9
10 2
Grafos. EDA. Curso 2002/0337
MFSet. Rep. en árbol (cont.)
Los árboles no son necesariamente binarios, pero surepresentación es muy fácil ya que sólo necesitaremos unapuntador al padre:
MFSet M= vector[1..N] de enteros;
M[i] es el padre del elemento i;
Podemos hacer que la raíz se apunte a sí mismo: i es raíz si M[i]=i.
Grafos. EDA. Curso 2002/0338
Ejemplo
3
5
1 7 4
8
6 9
10 2
5 9 3 5 3 8 5 8 8 61 2 3 4 5 6 7 8 9 10
Grafos. EDA. Curso 2002/0339
Operaciones
Combina:Combina: hacer que la raíz de un árbol sea hijo del otro.Coste constante.Encuentra:Encuentra: devolver la raíz del árbol que contiene a x.Coste proporcional a la profundidad del nodo, que en elpeor de los casos es N-1.Coste amortizado: m operaciones de búsqueda tendrían uncoste O(mN) en el peor caso.
Grafos. EDA. Curso 2002/0340
Mejoras del Coste. Heurísticos
m operaciones Encuentra tienen un coste O(m)Combinar por Rango: en la operación combina hacer que la raíz del árbolcon menos nodos apunte a la raíz del árbol con más nodos. Para ello encada nodo se mantiene un rangorango que aproxima el logaritmo de la talla delsubárbol, es una cota de la altura del nodo.
Comprimir Caminos: en la operación Encuentra, todo nodo en el caminode x a la raíz cambia su padre por la raíz. Permite realizar las moperaciones de búsqueda con coste O(m (m,n)), donde (m,n) es unainversa de la función de Ackerman que crece muy lentamente.
Grafos. EDA. Curso 2002/0341
Implementación de Combina
Construir_Cjto(x) {M[x]=x; rango[x]=0;
}
Combina(x,y) {Une(Encuentra(x),Encuentra(y));
}
Une(x,y) {if (rango[x]>rango[y]) M[y]=x;else {M[x]=y; if (rango[x]=rango[y])
rango[y]++; }
}
Grafos. EDA. Curso 2002/0342
Operación Encuentra
1
2 3 5
4 6 7
8
1
2 3 5
4 6
7 8
Encuentra(8)=1Encuentra(8)=1
Encuentra(x)if (x M[x]) M[x]=Encuentra(M[x]);devuelve M[x];
Grafos. EDA. Curso 2002/0343
Coste Amortizado
M operaciones EncuentraSi se usa Combinar por Rango: O(M log N)Si además se hace Comprimir Caminos: O(M (M,N)). Lousual es que (M,N) y por lo tanto O(M).
Grafos. EDA. Curso 2002/0344
Algoritmo de Prim: Idea Voraz
Construir incrementalmente un árbol (de recubrimiento oextensión), tomando como raíz cualquier vértice del grafoy seleccionando en cada paso una arista (u,v) de E tal que:
Una un vértice presente en T con uno que no lo esté.Produzca el menor incremento de peso posible.El árbol de recubrimiento o extensión se obtiene cuando se hanseleccionado exactamente |V|-1 aristas válidas.
Grafos. EDA. Curso 2002/0345
Idea: construir paso a paso un Árbol de recubrimiento de G = (V, E) Paso 0: la raíz del Árbol es un Vértice cualquiera de G
V’ = {0}E’ ={}
Paso i: dado v V’, seleccionar la Arista (v,w) de G tal que:• w V’• w V’ , (v,w) tenga coste mínimo
Algoritmo de Prim
Paso i:w = min(aristasFactibles) V’ = V’ w
E’ = E’ (v,w) Terminación: i = |E- 1|
Grafos. EDA. Curso 2002/0346
Árbol de recubrimiento (Spanning Tree) de un gnd
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
Ejemplo:
Grafos. EDA. Curso 2002/0347
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
a
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
a
b
b
c
min(aristasFactibles)
¿?
Paso 0:
V’ = {a}
E’ ={}pesoMin = 0
Paso 1:
V’ = { a, b}
E’ ={ a,b) }pesoMin=4
aristasFactibles= aristasFactibles= b,4), h,8)Paso 2:aristasFactibles= c,8), h,8), h,11)V’ = { a, b, c }
E’ ={ a,b), b, c) }pesoMin = 12Aristas factibles: Vértices adyacentes a a y b NO visitados
ordenados por pesoordenados por peso
Grafos. EDA. Curso 2002/0348
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
a
b c
a
h
b d c
e
g
i
f
4
1
8 79
14
10
478
112
2
a
b c
i
Paso 0:aristasFactibles=V’ = { a}E’ ={}pesoMin = 0
Paso 1:aristasFactibles= b,4), h,8)V’ = { a, b}E’ ={ a,b)}pesoMin = 4
aristasFactibles..eliminarMin()
Paso 2:aristasFactibles= c,8), h,8), h,11)V’ = { a, b, c }E’ ={ a,b), b, c) }pesoMin = 12
Paso 3:aristasFactibles=(i,2),(f,4),(d,7),(h,8),(h,11)V’ = { a, b, c, i }E’ ={ a,b), b,c) c,i) }pesoMin = 14
Grafos. EDA. Curso 2002/0349
public voidpublic void mSTPrim () {
// resultados del problemaV’=new int[numVertices]; Lista E’=new ListaEnlazada();;
for (int i=0 ; i<=numVertices ; i++) V’[i]=0;
// Paso 0: la raíz del Árbol es un Vértice cualquiera de GV’[0] = 1 ;aristasFactibles = new MonticuloBinario(newnew Arista());
Vértice w Ady(0) aristasFactibles.insertar(new Arista(w,coste0W)); while (E’..length() < numVertices ) { Arista par=((Arista)aristasFactibles.eliminarMin());
w=par..dest; if (V’[w]==0) {
V’[w]=1; // V’ = V’ wE’..insertar(par); // E’ = E’ (v,w)
Vértice u Adyacentes(w) // actualizar las Aristas factibles if (V’[u] == 0) aristasFactibles.insertar(new Arista(u,costeUW));
}}
tmSTPrim ( |E| log |V| )
|E| veces ( log |E| )|V2| )|V| )
(|E|)
( log|V|)