La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

GRAFOS ESTRUCTURAS DE DATOS.

Presentaciones similares


Presentación del tema: "GRAFOS ESTRUCTURAS DE DATOS."— Transcripción de la presentación:

1 GRAFOS ESTRUCTURAS DE DATOS

2 Componentes conexas: entre ellas son conexas
De un grafo no dirigido Se pude saber si es conexo Si no lo es se pueden conocer sus Componentes Conexas Conjunto W, de vértices del grafo En el cual hay camino desde cualquier V1 a cualquier V2 Donde V1 y V2 pertenecen a W Componentes conexas: entre ellas son conexas CONEXO A C B D E A C B D E No CONEXO

3 ALGORTIMO: DETERMINAR CONEXIÓN
Si entre todos los vértices, hay camino Un recorrido desde cualquier vértice Visitara a TODOS los vértices del grafo Si no Tendremos una componente conexa Conjunto de vértices recorrido Para descubrir otras Repetir recorrido desde un vértice no visitado Hasta que todos los vértices hayan sido visitados

4 EJEMPLO A B E A B E C D C D Componente Conexa W1 Recorrido desde E
Recorrido desde B Conjunto recorridos = Conjunto de Vertices Es CONEXO B A

5 Las componentes forman una Lista de Listas
IMPLEMENTACION No olvidar: Luego de recorrer, obtendremos un conjunto de vertices LRecorrido bool ComponentesConexas(Grafo G, LSE *LComponentes){ Vertice *V; LSE *LRecorrido; while(TRUE){ V = BuscarVerticeNoVisitado(G); if(!V) break; LRecorrido = RecorrerAnchura(G,*V); LSE_InsertarNodoFin(LComponentes, LSE_CrearNodo(LRecorrido)); } if(LComponentes->header == LComponentes->last) return TRUE; return FALSE; Las componentes forman una Lista de Listas

6 COMPONENTES FUERTEMENTE CONEXAS
De un grafo DIRIGIDO Se puede saber si es FUERTEMENTE CONEXO Si no lo es se pueden conocer sus Componentes Fuertemente Conexas Conjunto W, de vertices del grafo En el cual hay camino desde cualquier V1 a cualquier V2 Donde V1 y V2 pertenecen a W No CONEXO 4 5 6 8 C F H B S Componentes CONEXO

7 ALGORITMO Dado un Vo, se desea conocer
Los vertices a los que se puede llegar (D) Los vertices que llegan a Vo (A) Si D interseccion A = V entonces Hay camino entre cualquier par de vertices Fuertemente conexo Si no Tendremos una componente conexa Conjunto de vertices recorrido Para descubrir otras Repetir recorrido desde vertice que no sea elemento de una C.F.C. Hasta que todos los vertices esten en C.F.C

8 EJEMPLO C B H F S W = D  A C B W1 = {B, C, S} W2 = {H} W3 = {F} H
W <> V, Componente F.C. F S 1) Recorrer desde B (Descendientes) 1) Recorrer desde H (Descendientes) 1) Recorrer desde F (Descendientes) D = B S C D = H F C B S D = F C B S 2) Invertir Direcciones 3) Recorrer desde B (Ascendientes) 3) Recorrer desde H (Ascendientes) 3) Recorrer desde F (Ascendientes) A = B C F H S A = H A = F H

9 PUNTOS DE ARTICULACION
En un grafo no dirigido conexo Existen vertices que si se eliminan “Desconectan” al Grafo Lo dividen en componentes conexas Estos vertices “clave” Son puntos de articulacion Si un grafo no tiene P.A. Es biconexo La conectividad de un grafo Es el numero de nodos que se necesitan eliminar Para dejar a un grafo “desconectado”

10 EJEMPLO A D C B E F Puntos de Articulacion

11 ARBOL DE EXPANSION Para poder calcular los P.A. de un grafo
Hay que obtener el arbol de expansion Este se obtiene A partir del Recorrido en Profundidad Ejemplo A C D F A B E C E Arco en Retroceso: Cuando se quiere visitar un nodo que ya ha sido visitado y no es el padre D B F

12 COMO REPRESENTAR EL ARBOL DE EXPANSION
Un arbol en expansion No es un arbol binario Cada Vertice puede tener 0, 1 o n hijos Si sabemos que CADA VERTICESOLO TIENE UN PADRE Si no tomamos en cuenta los Arcos en Retroceso La representacion depende del Grafo Matriz de Ady -> Usar un arreglo o Lista de Ady -> Una lista La representacion mostrará Quien es el padre de cada nodo

13 ARBOL DE EXPANSION CON MATRIZ DE ADY.
Los vertices del grafo Se encuentran en un arreglo Cada indice del arreglo Representa un vertice Ej: A – 0, B – 1, etc Al representar el arbol de expansion El padre(indice) de cada nodo Puede almacenarse en un arreglo Que tambien represente a los vertices A B C E D F 4 5 2 A 1 B 2 C 3 D 4 E 5 F typedef struct TVertices{ Generico V[MAX]; int Padres[MAX]; int nvertices; }Vertices;

14 ARBOL DE EXP. CON LISTA DE ADYACENCIA
Los vertices del grafo Se encuentran en una lista Cada nodo Representa un vertice Al representar el arbol de expansion De cada nodo de esta lista Solo nos interesa conocer al padre Se puede añadir un dato al nodo vertice Un enlace con el padre D F A B C D E F typedef struct Vertice{ Generico Informacion; Vertice *padre; Lista *LArcos; }Vertice;

15 ALGORITMO: ENCONTRAR P.A.
Num(v) se calcula a medida que se genera el Arbol de Expansion Para calcular Bajo(v), se necesita bajar hasta conocer los Bajos(hijos de v) A cada vertice numerarlo De acuerdo al recorrido Se obtiene Num(v) A c/vertice, calcular Bajo(v) Minimo entre Num(v) Num(arco_retroceso de v) Bajo(hijos de v) P.A. son La raiz si tiene >= 2 hijos Vertices para los cuales Algun Bajo(hijo de v) >= Num(v) 1 ,1 Min(1, --, 2) A es P.A. A C es P.A. 2 ,2 3 ,3 D C Min(3, --, 3) F 4 ,3 Min(2, --, --) Min(4, ---, 3) E 5 ,3 B Min(5, ---, 3) 6 ,3 Min(6, 3, ----)

16 CAMBIOS EN EL ARBOL Tanto Num(v) como Bajo(v)
Deben ser parte ahora de la estructura Del arbol typedef struct TVertices{ Generico V[MAX]; int Padres[MAX]; int Num[MAX]; int Bajo[MAX]; int nvertices; }Vertices; typedef struct Vertice{ Generico Informacion; int Num, Bajo; Vertice *padre; Lista *LArcos; }Vertice;

17 COMO IMPLEMENTAR?? Primero Luego Que representacion se usara?
Si es M.A. Usar Arbol de Expansion como un tipo aparte Si es L.A. Usar Grafo para trabajar con Arbol de Exp. Luego Recorrer el grafo Para llenar Num y enlazar a los padres Calcular Bajo Y con esta informacion decidir cual es punto de art.

18 IMPLEMENTACION CALCULAR NUM y PADRES
//Al recorrer, llenar Num y enlazar con los padres void RecorrerParaArbol(Grafo G, Vertice *V, int *vez){ int i; LSE_nodo *p; V->visitado = TRUE; *vez++; ((Vertice *)(p->G))->Num = *vez; for(p = V->LA->header; p!=NULL; p= p->sig){ if(!((Vertice *)(p->G))->Visitado){ RecorrerParaArbol(G, p->G, vez); ((Vertice *)p->G)->padre = V; } Al vertice de origen, marcar como vistado y contarlo, hay que llevar rastreo del aumento del contador

19 IMPLEMENTACION CALCULAR BAJO
//Para calcular el Bajo de Vorigen, calcular Bajo de los hijos(en recorrido9 //Es decir, recorrer otra vez el grafo para poder “bajar” x el mismo void CalcularBajo(Grafo G, Vertice *V ){ int i; LSE_nodo *p; Vertice *Ad; V->visitado = TRUE; V->Bajo = V->Num; for(p = V->LA->header; p!=NULL; p= p->sig){ Ad = Generico_ObtenerVertice(p->G); if(!Ad->Visitado){ CalcularBajo(G, Ad); if(Ad->Bajo < V->Bajo) V->Bajo = A->Bajo; }else if(V->padre!=Ad) if(Ad->Num < V->Bajo) V->Bajo = Ad->Num; } Antes de llamar a esta funcion, el grafo debe de volver a quedar como si no se hubiese recorrido antes Calcular el bajo del hijo, si es menor que el actual, cambiarlo Si ya fue visitado y no es el padre: arco en retroceso

20 EJERCICIO Escriba una funcion que dado un Grafo permita conocer los puntos de Articulacion del mismo Recuerde que los P.A. son vertices


Descargar ppt "GRAFOS ESTRUCTURAS DE DATOS."

Presentaciones similares


Anuncios Google