GRAFOS ESTRUCTURAS DE DATOS COMPONENTES CONEXAS De un

  • Slides: 20
Download presentation
GRAFOS ESTRUCTURAS DE DATOS

GRAFOS ESTRUCTURAS DE DATOS

COMPONENTES CONEXAS � De un grafo no dirigido � � Componentes conexas: entre ellas

COMPONENTES CONEXAS � De un grafo no dirigido � � Componentes conexas: entre ellas son conexas 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 V 1 a cualquier V 2 � Donde V 1 y V 2 pertenecen a W CONEXO A B C E D No CONEXO

ALGORTIMO: DETERMINAR CONEXIÓN � Si entre todos los vértices, hay camino � Un recorrido

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 � Conjunto � Para una componente conexa de vértices recorrido descubrir otras � Repetir recorrido desde un vértice no visitado � Hasta que todos los vértices hayan sido visitados

EJEMPLO A B E D A Recorrido desde E B Conjunto recorridos = Conjunto

EJEMPLO A B E D A Recorrido desde E B Conjunto recorridos = Conjunto de Vertices Es CONEXO E C A Component e Conexa W 1 D Recorrido desde B B E D D Recorrido desde E C B C C E A Component e Conexa W 2

IMPLEMENTACION No olvidar: Luego de recorrer, obtendremos un conjunto de vertices LRecorrido bool Componentes.

IMPLEMENTACION No olvidar: Luego de recorrer, obtendremos un conjunto de vertices LRecorrido bool Componentes. Conexas(Grafo G, LSE *LComponentes){ Vertice *V; LSE *LRecorrido; Las componentes while(TRUE){ forman una Lista de V = Buscar. Vertice. No. Visitado(G); Listas if(!V) break; LRecorrido = Recorrer. Anchura(G, *V); LSE_Insertar. Nodo. Fin(LComponentes, LSE_Crear. Nodo(LRecorrido)); } if(LComponentes->header == LComponentes->last) return TRUE; return FALSE; }

COMPONENTES FUERTEMENTE CONEXAS � De un grafo DIRIGIDO � � Se puede saber si

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 V 1 a cualquier V 2 � Donde V 1 y V 2 pertenecen a W No CONEXO C B H 4 Componentes 8 5 6 F S CONEXO

ALGORITMO � Dado un Vo, se desea conocer Los vertices a los que se

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

C EJEMPLO B H F S C W=D A B H S 1) Recorrer

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

PUNTOS DE ARTICULACION � En un grafo no dirigido conexo � Existen vertices que

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” � � Si un grafo no tiene P. A. � � Son puntos de articulacion Es biconexo La conectividad de un grafo � Es el numero de nodos que se necesitan eliminar � Para dejar a un grafo “desconectado”

EJEMPLO A B C D Puntos de Articulacion E F

EJEMPLO A B C D Puntos de Articulacion E F

ARBOL DE EXPANSION � Para poder calcular los P. A. de un grafo �

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

COMO REPRESENTAR EL ARBOL DE EXPANSION � Un arbol en expansion No es un

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

ARBOL DE EXPANSION CON MATRIZ DE ADY. � � Los vertices del grafo �

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 A B C E D F Al representar el arbol de expansion � El padre(indice) de cada nodo � Puede almacenarse en un arreglo � Que tambien represente a los vertices typedef struct TVertices{ Generico V[MAX]; int Padres[MAX]; int nvertices; }Vertices; 0 0 0 5 2 1 2 3 4 5 A B C D E F 0 4

ARBOL DE EXP. CON LISTA DE ADYACENCIA B A � C Los vertices del

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

ALGORITMO: ENCONTRAR P. A. Num(v) se calcula a medida que se genera el Arbol

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 A es P. A. De acuerdo al recorrido � Se obtiene Num(v) � � Minimo entre � Num(arco_retroceso � Bajo(hijos de v) Min(1, --, 2) C D C es P. A. 3 , 3 Min(3, --, 3) 4 , 3 Min(4, ---, 3) F 5 , 3 de v) P. A. son La raiz si tiene >= 2 hijos � Vertices para los cuales � � Algun A Min(2, --) � Num(v) � 2 , 2 A c/vertice, calcular Bajo(v) � 1 , 1 Bajo(hijo de v) >= Num(v) E Min(5, ---, 3) 6 , 3 B Min(6, 3, ----)

CAMBIOS EN EL ARBOL � Tanto Num(v) como Bajo(v) �Deben ser parte ahora de

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

COMO IMPLEMENTAR? ? � Primero � Que representacion se usara? � Si es M.

COMO IMPLEMENTAR? ? � Primero � Que representacion se usara? � Si es M. A. � Usar � Si Arbol de Expansion como un tipo aparte 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.

IMPLEMENTACION CALCULAR NUM y PADRES //Al recorrer, llenar Num y enlazar con los padres

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

IMPLEMENTACION CALCULAR BAJO //Para calcular el Bajo de Vorigen, calcular Bajo de los hijos(en

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

EJERCICIO � Escriba una funcion que dado un Grafo permita conocer los puntos de

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