Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
INTRODUCCIóN A LA TEORíA DE GRAFOS Tecnología Digital V: Diseño de Algoritmos Universidad Torcuato Di Tella Definiciones Definición Un grafo es un par � = (+, �) tal que ... 1. + es un conjunto finito (llamado el conjunto de vértices de �), y 2. � ⊆ {8 9 ∈ + ×+ : 8 ≠ 9} es un conjunto de aristas. 1 3 2 4 6 5 7 # En este ejemplo, + = {1, . . . , 7} y � = {12, 13, 23, 24, 34, 36, 45, 47, 56, 57, 67}. 1 Definiciones 1 3 2 4 6 5 7 # El orden de los extremos de una arista no es importante. Nos referimos indistintamente a la arista 34 como 43 o bien {3, 4}. Definiciones 1. Si 8 9 ∈ �, decimos que los vértices 8 y 9 son vecinos. 2. Dado 8 ∈ + , definimos el vecindario de 8 como #(8) = { 9 ∈ + : 8 9 ∈ �}. 3. El grado de un vértice 8 ∈ + es 3(8) = |#(8)|. 2 Motivación (1/6) Red vial I Representamos con grafos un mapa de rutas entre un grupo de ciudades (los vértices representan las ciudades y los cruces de caminos). 3 Motivación (2/6) Red vial II Cambiando la interpretación, con grafos podemos representar mapas de ciudades (los vértices representan las esquinas!). 4 Motivación (3/6) Red de transporte Podemos representar una red de transporte con grafos (los vértices representan las estaciones/paradas). 5 Motivación (4/6) Redes sociales Podemos representar relaciones entre usuarios de una red social (los vértices representan los usuarios). 6 Motivación (5/6) Conflictos de horarios Cursos a dictar y superposiciones entre cursos (dos vértices son vecinos si sus cursos se solapan). 7 Motivación (6/6) Conflictos espaciales Antenas en una red de telefonía celular (dos vértices son vecinos si sus antenas tienen áreas de cobertura superpuestas). 8 Definiciones 1 3 2 4 6 5 7 Definiciones # Un camino entre dos vértices 8 y 9 es una secuencia de aristas desde 8 hasta 9. # La distancia entre dos vértices es la cantidad de aristas del camino más corto entre ellos. # Un grafo es conexo si existe un camino entre todo par de vértices. 9 Definiciones 1 3 2 4 6 5 7 Definiciones # Una componente conexa es un subconjunto de vértices conexo, maximal con esta propiedad. # Un vértice aislado es un vértice 8 con 3(8) = 0 (que conforma una componente conexa de tamaño 1). 1. Un grafo conexo tiene exactamente una componente conexa. 2. Si 8 y 9 están en componentes conexas distintas, decimos que hay una distancia infinita entre ellos. 10 Representación de grafos # Nos interesa programar algoritmos que trabajen sobre grafos. Para esto, debemos representar adecuadamente grafos en C++ (cómo lo hacemos?). Definición La matriz de adyacencia de un grafo � es una matriz � = (08 9) ∈ ℝ|+ |×|+ | tal que 08 9 = 1 si 8 9 ∈ � y 08 9 = 0 en caso contrario. 1 3 2 4 6 5 7 � = ©« 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 ª®®®®®®®®®¬ 11 Representación de grafos c l a s s Grafo { publ ic : Grafo ( i n t n ) ; ~Grafo ( ) ; void agregarAr is ta ( i n t i , i n t j ) ; void e l iminarAr i s t a ( i n t i , i n t j ) ; bool e x i s t eA r i s t a ( i n t i , i n t j ) ; p r iva te : i n t _v e r t i c e s ; bool∗∗ _adj ; } 12 Representación de grafos // Constructor Grafo : : Grafo ( i n t n ) { _v e r t i c e s = n ; _adj = new bool ∗ [n ] ; f o r ( i n t i =0 ; i <n ; ++ i ) _adj [ i ] = new bool [n ] ; } // Destructor Grafo : : ~ Grafo ( ) { fo r ( i n t i =0 ; i < _ve r t i c e s ; ++ i ) de l e t e [ ] _adj [ i ] ; de l e t e [ ] _adj ; } 13 Representación de grafos // Agrega una a r i s t a void Grafo : : agregarAr is ta ( i n t i , i n t j ) { _adj [ i ] [ j ] = _adj [ j ] [ i ] = t rue ; } // Elimina una a r i s t a void Grafo : : e l iminarAr i s t a ( i n t i , i n t j ) { _adj [ i ] [ j ] = _adj [ j ] [ i ] = f a l s e ; } // Consulta por a r i s t a bool Grafo : : e x i s t eA r i s t a ( i n t i , i n t j ) { re turn _adj [ i ] [ j ] ; } 14 Representación de grafos # Ventajas de esta representación: 1. Agregar una arista: $(1). 2. Eliminar una arista: $(1). 3. Consultar si existe arista: $(1). # Desventajas de esta representación: 1. Agregar un vértice: $(=2). 2. Eliminar un vértice: $(=2). 3. Obtener todos los vecinos de un vértice: $(=). 15 Representación de grafos Definición. La matriz de incidencia de un grafo � es una matriz" = (<8 9) ∈ ℝ|+ |×|� | tal que <84 = 1 si el vértice 8 es uno de los extremos de la arista 4, y <84 = 0 en caso contrario. # En nuestro ejemplo, � = {12, 13, 23, 24, 34, 36, 45, 47, 56, 57, 67}. " = ©« 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 ª®®®®®®®®®¬ # Es una representación conveniente? 16 Representación de grafos # Una tercera opción es por medio de listas/conjuntos de vecinos asociados con cada vértice: 1 3 2 4 6 5 7 1 → {2, 3} 2 → {1, 3, 4} 3 → {1, 2, 4, 6} 4 → {2, 3, 5, 7} 5 → {4, 6, 7} 6 → {3, 5, 7} 7 → {4, 5, 6} 17 Representación de grafos c l a s s Grafo { . . . p r iva te : vector < set <int > > _vecinos ; } // Constructor Grafo : : Grafo ( i n t n ) { fo r ( i n t i =0 ; i <n ; ++ i ) _vecinos . push_back ( set <int > ( ) ) ; } 18 Representación de grafos // Agrega una a r i s t a void Grafo : : agregarAr is ta ( i n t i , i n t j ) { _vecinos . a t ( i ) . i n s e r t ( j ) ; _vecinos . a t ( j ) . i n s e r t ( i ) ; } // Elimina una a r i s t a void Grafo : : e l iminarAr i s t a ( i n t i , i n t j ) { _vecinos . a t ( i ) . e rase ( j ) ; _vecinos . a t ( j ) . e rase ( i ) ; } // Consulta por a r i s t a bool Grafo : : e x i s t eA r i s t a ( i n t i , i n t j ) { re turn _vecinos . a t ( i ) . f ind ( j ) != _vecinos . a t ( i ) . end ( ) ; } 19 Representación de grafos # Ventajas de esta representación: 1. Obtener todos los vecinos de un vértice: $(1). 2. Agregar un vértice: $(=). # Desventajas de esta representación: 1. Agregar una arista: $(log =) (depende de la implementación de set). 2. Eliminar una arista: $(log =). 3. Consultar si existe arista: $(log =). 4. Eliminar un vértice: $(=). 20 Grafos dirigidos Definición Un grafo dirigido (o digrafo) es un par � = (#, �) tal que ... 1. # es un conjunto finito (llamado el conjunto de nodos de �), y 2. � ⊆ {(8 , 9) ∈ + ×+ : 8 ≠ 9} es un conjunto de pares ordenados, llamados arcos. 1 3 2 4 6 5 # A diferencia de los grafos (no dirigidos), ahora las aristas son pares ordenados. 21 Definiciones 1 3 2 4 6 5 # Diferenciamos entre el grado de entrada y el grado de salida de cada nodo. 1. 3−(8) = |#−(8)| = |{ 9 ∈ # : (9 , 8) ∈ �}|. 2. 3+(8) = |#+(8)| = |{ 9 ∈ # : (8 , 9) ∈ �}|. # Un camino entre dos nodos es una secuencia de arcos entre ellos, respetando el sentido de los arcos. 22
Compartir