Estructuras de datos Grafos

Documentos relacionados
TEMA 5 El tipo grafo. Tipo grafo

Complejidad amortizada

Grafos. Amalia Duch Brown Octubre de 2007

Centro Asociado Palma de Mallorca. Tutor: Antonio Rivero Cuesta

Estructuras de datos Árboles B

Grafos. Suponiendo que e = [u, v]. Entonces los nodos u y v se llaman extremos de e y u y v se dice que son nodos adyacentes o vecinos.

Árboles. Un grafo no dirigido es un árbol si y sólo si existe una ruta unica simple entre cualquiera dos de sus vértices.

El TAD Grafo. El TAD Grafo

Análisis y Complejidad de Algoritmos. Arboles Binarios. Arturo Díaz Pérez

Grafos. AMD Grado en Ingeniería Informática. AMD Grado en Ingeniería Informática (UM) Grafos 1 / 30

Programación dinámica p. 1

1. GRAFOS : CONCEPTOS BASICOS

Apuntes elaborados por: Aaron Asencio, Eduardo Quevedo, Raquel López Revisado por: Javier Miranda el???

Matemáticas Discretas Tc1003 Teoría de Grafos

Teoría de Grafos Introducción Grafos isomorfos

Este material es de uso exclusivo para clase de algoritmos y estructura de datos, la información de este documento fue tomada textualmente de varios

INDICE INTRODUCCION1 DESARROLLO2 GRAFOS (CONCEPTO).2 ARISTAS...2 VERTICES2 CAMINOS.3 CLASIFICACION DE GRAFOS...3 GRAFOS EULERIANOS.

Definición 1.1 Sea G = (V, A) un grafo no dirigido. G se denomina árbol si es conexo y no contiene ciclos.

En la fig. 1 se representa el grafo, G=(V,A) donde: V = {1, 2, 3, 4, 5, 6} A = { {1,2}, {1,3}, {1,5}, {3}, {3,4}, {4,5}, {5,6} }

Tema: Los Grafos y su importancia para la optimización de redes.

Árboles generadores mínimos (MST) comp-420

Definición: NODO Un nodo es un punto de intersección o unión de varios elementos que confluyen en el mismo lugar.

Teoría de grafos y optimización en redes

Grafos. Algoritmos y Estructuras de Datos III

PRÁCTICA No. 9 RECORRIDOS EN ÁRBOLES BINARIOS

Introducción a la Teoría de Grafos

El método main de la clase PruebaArbol, empieza creando una instancia de un objeto Árbol vacío y asigna su referencia a la variable árbol

Caminos y Flujos optimales. Introducción a la Investigación de Operaciones 2007

Ruta más Corta con una sóla Fuente de Inicio (Single-Source Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

Grafos y Redes. 3. Resolución: Dibujar el camino sin levantar el lápiz y pasando sólo una vez por cada arco o arista.

Algoritmos y estructuras de datos

2007 Carmen Moreno Valencia

El TAD Grafo. El TAD Grafo

MATEMÁTICAS PARA LA COMPUTACIÓN

Estructuras de Datos Orientadas a Objetos. Pseudocódigo y aplicaciones en C#.NET. Capítulo 9.- Grafos

Grafos. CCIR / Depto Matemáticas CB102

Es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre

TEMA IV TEORÍA DE GRAFOS

Capítulo 6. Relaciones. Continuar

Tema 7: Problemas clásicos de Programación Lineal

Dimensionamiento y Planificación de Redes

Un grafo G = (V, E) se dice finito si V es un conjunto finito.

Tema Árboles generales. 9.2 Árboles binarios 9.3 Árboles de búsqueda

Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap)

Triangulación de Polígonos: Problema de la Galería de Arte. Geometría Computacional, MAT-125

Los elementos de V son los vértices (o nodos) de G y los elementos de A son las aristas (o arcos) de G.

Flujos de redes (Network Flows NF)

Relaciones. Estructuras Discretas. Relaciones. Relaciones en un Conjunto. Propiedades de Relaciones en A Reflexividad

LECCION N 08 ARBOLES. Un árbol es un grafo A que tiene un único nodo llamado raíz que:

Algebra Matricial y Teoría de Grafos

UNIDAD 9. DATOS COMPLEJOS PILAS

TEORIA DE GRAFOS. Estructuras Discretas Ing. Jenny Paredes Aguilar

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

TEORÍA DE GRAFOS Ingeniería de Sistemas

Algoritmos para determinar Caminos Mínimos en Grafos

Capítulo 4: Grafos Clase 2: Caminos, Circuitos Eulerianos y Hamiltonianos

Algoritmos sobre Grafos

Matemáticas Discretas TC1003

Tema 1: Matrices. October 13, 2016

Propiedades de lenguajes independientes del contexto

Tema: Algoritmos para la ruta más corta en un Grafo.

Minicurso de Teoría de Gráficas Escuela de Verano 2014 por María Luisa Pérez Seguí Facultad de Ciencias Físico-Matemáticas, Universidad Michoacana

SESIÓN N 07 III UNIDAD RELACIONES Y FUNCIONES

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

1. Leer el primer número y almacenarlo en la raíz del árbol. 2. Repetir hasta encontrar un duplicado o el árbol esté vacío.

Francis Guthrie Planteo el problema de los cuatro colores, después de colorear el mapa de Inglaterra 9/15/2015 3

Árboles abarcadores mínimos: algoritmo de Prim y algoritmo de Kruskal.

Recorrido por niveles. Algoritmo recorrido por niveles

(e) Con la poda alfa-beta se eliminan nodos que nunca serán alcanzados

A5 Introducción a la optimización en redes

Unidad I. Solución de ecuaciones no lineales 1. Métodos cerrados. LMM

Tema 01: Algoritmia y diagramas de flujo. Estructuras de datos (Prof. Edgardo A. Franco)

LAS CIENCIAS DE LA PLANIFICACIÓN

Conceptos básicos útiles. PF-5028 Minería de datos Prof. Braulio José Solano Rojas UCR

Estructura de datos Colas

Un grafo G es un par (V,E) donde V es un conjunto (llamado conjunto de vértices) y E un subconjunto de VxV (conjunto de aristas).

Geometría Computacional. Dr. Antonio Marín Hernández

Coloración. Unos cuantos problemas. Asignación de frecuencias de radio. Gregorio Hernández Peñalver. Unos cuantos problemas. Unos cuantos problemas

Clases e instancias. Algoritmos y Estructuras de Datos I. Clases e instancias. memoria dinámica.

Tema 10- Grafos. Objetivos:

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Complejidad computacional (Análisis de Algoritmos)

Una Interfaz Grafo-Matriz

Matemáticas Discretas TC1003

TIPOS DE ARBOLES. Integrantes: Liliana Xitlali Martinez Lovera Octavio Catarino Aguilar

Introducción a la teoría de grafos

Estructuras de Datos y Algoritmos

Grafos Los siete puentes de Königsberg: Teoría de Grafos

Coloración de grafos

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.

TÍTULO: MATEMÁTICA DISCRETA Y LÓGICA Disponibilidad

Objetivos formativos de Matemática Discreta. Tema 1: Conjuntos, aplicaciones y relaciones

Parciales Matemática CBC Parciales Resueltos - Exapuni.

Tema I Testing Estructurado

Tema 4: Redes y flujos

Transcripción:

Estructuras de datos Grafos Dra. Elisa Schaeffer elisa.schaeffer@gmail.com PISIS / FIME / UANL Grafos p. 1

Matriz de adyacencia Un grafo G = (V,E) de n vértices etiquetados 1,2,3,...,n. Grafos p. 2

Matriz de adyacencia Un grafo G = (V,E) de n vértices etiquetados 1,2,3,...,n. Usar la matriz de adyacencia es eficiente sólo cuando G es bastante a denso. Grafos p. 2

Matriz de adyacencia Un grafo G = (V,E) de n vértices etiquetados 1,2,3,...,n. Usar la matriz de adyacencia es eficiente sólo cuando G es bastante a denso. La matriz ocupa O(n 2 ) elementos y si m es mucho menor que n 2, la mayoría del espacio reservado tiene el valor cero. a Si estuviera muy denso, sería mejor guardar su complemento. Grafos p. 2

Listas de adyacencia Se necesita un arreglo a[], cada elemento de cuál es una lista de largo dinámico. La lista de a[i] contiene las etiquetas de cada uno de los vecinos del vértice i. El tamaño de la estructura de listas de adyacencia es O(n+m) O(m) = O(n 2 ) (aunque en muchos casos es mucho menor). Esto es muy parecido al implementar un grafo como una estructura enlazada, con punteros a todos los vecinos de cada vértice. Grafos p. 3

Búsqueda y recorrido Recorrido = el proceso de aplicación de un método sistemático para visitar cada vértice Búsqueda = un método sistemático para recorrer un grafo de entrada G = (V,E) con el propósito de encontrar un vértice del G que tenga una cierta propiedad Estos algoritmos comúnmente utilizan colas o pilas. Grafos p. 4

Usos de recorridos la búsqueda de vértices la construcción de caminos la computación distancias la detección de ciclos la identificación de los componentes conexos Grafos p. 5

Búsqueda en profundidad (DFS) Dado G y un vértice inicial v V 1. Crea una cola vacía L 2. Asigna u := v 3. Marca u visitado 4. Añade los vecinos no marcados de v al comienzo de L 5. Quita del comienzo de L todos los vértices marcados 6. Si L está vacía, termina 7. Asigna u := el primer vértice en L 8. Quita el primer vértice de L 9. Continua de paso (3) Grafos p. 6

Formulación recursiva Dado un vértice de inicio, el grafo G = (V,E) y un conjunto L de vértices ya visitados (inicialmente L := ), dfs(v,g,l){ L := L {v} para todo w Γ(v)\L : dfs(w, G, L). } Grafos p. 7

Orden de visitas DFS puede progresar en varias maneras. Grafos p. 8

Orden de visitas DFS puede progresar en varias maneras. El orden de visitas depende de cómo se elige a cuál vecino se va. Grafos p. 8

Orden de visitas DFS puede progresar en varias maneras. El orden de visitas depende de cómo se elige a cuál vecino se va. Las opciones son visitar antes o después de llamar la subrutina para los vecinos. Grafos p. 8

Orden de visitas DFS puede progresar en varias maneras. El orden de visitas depende de cómo se elige a cuál vecino se va. Las opciones son visitar antes o después de llamar la subrutina para los vecinos. Si la visita se realiza antes de la llamada recursiva se llama el preorden. Grafos p. 8

Orden de visitas DFS puede progresar en varias maneras. El orden de visitas depende de cómo se elige a cuál vecino se va. Las opciones son visitar antes o después de llamar la subrutina para los vecinos. Si la visita se realiza antes de la llamada recursiva se llama el preorden. En el caso de visitar después, es llama postorden. Grafos p. 8

Preorden y postorden dfs(v,g,l){ L := L {v} preorden: imprimirv para todo w Γ(v)\L : dfs(w, G, L). postorden: imprimirv } Grafos p. 9

Complejidad asintótica O(n+m) Grafos p. 10

Complejidad asintótica O(n+m) Por arista: procesada por máximo una vez de ida y otra de vuelta. Grafos p. 10

Complejidad asintótica O(n+m) Por arista: procesada por máximo una vez de ida y otra de vuelta. Por vértice: procesado una vez; los ya marcados no serán revisitados. Grafos p. 10

Clasificación de las aristas Aristas de árbol = las aristas por las cuales progresa el procedimiento, es decir, en la formulación recursiva, w fue visitado por una llamada devo vice versa. Estas aristas forman un árbol cubriente del componente conexo del vértice de inicio. Grafos p. 11

Varios árboles posibles Depende de la manera en que se ordena los vecinos que habrá que visitar cuáles aristan serán aristas de árbol. v es el padre (directo o inmediato) de w si v lanzó la llamada recursiva para visitar a w Si v es el padre de w, w es hijo v Cada vértice, salvo que el vértice de inicio, que se llama la raíz, tiene un vértice padre único. El número de hijos que tiene un vértice puede variar. Grafos p. 12

Antepasado y descendiente v es un antepasado de w si existe una sucesión de vértices v = u 1,u 2,...,u k = w tal que u i es el padre de u i+1. En ese caso, w es un descendiente de v. k = 2: v es el padre de w, v es el antepasado inmediato de w y w es un descendiente inmed. de v. La raíz es un antepasado de todos los otros vértices. Los vértices sin descendientes son hojas. Grafos p. 13

Otras clases de aristas (I) Una arista procedente conectan un antepasado a un descendiente no inmediato. (II) Una arista retrocedente conecta un descendiente a un antepasado no inmediato. (III) Una arista transversa conecta un vértice a otro tal que no son ni antepasados ni descendientes uno al otro están de diferentes ramos del árbol. Nota: procedentes y retrocedentes son la misma clase en un grafo no dirigido. Grafos p. 14

Nivel y altura nivel(v) = { 0, si v es la raíz, nivel(u)+1, si u es el padre de v. altura(v) = { 0, si v es una hoja, máx{altura(u)+1}, si u es un hijo de v. Grafos p. 15

Subárbol El subárbol de v es el árbol que es un subgrafo del árbol cubriente donde v es la raíz. = solamente vértices que son descendientes de v están incluidos además de v mismo. Grafos p. 16

Componentes conexos Se puede utilizar un algoritmo de recorrido para determinar los componentes conexos de un grafo. Grafos p. 17

Componentes conexos Se puede utilizar un algoritmo de recorrido para determinar los componentes conexos de un grafo. Un recorrido efectivamente explora todos los caminos que pasan por v. Grafos p. 17

Componentes conexos Se puede utilizar un algoritmo de recorrido para determinar los componentes conexos de un grafo. Un recorrido efectivamente explora todos los caminos que pasan por v. = Por iniciar DFS en el vértice v, el conjunto de vértices visitados por el recorrido corresponde al componente conexo de v. Grafos p. 17

Grafo no conexo Si el grafo tiene vértices que no pertenecen al componente de v, elegimos uno de esos vértices u y corremos DFS desde u. = Encontramos el componente conexo que contiene a u. Iterando se determina todos los componentes conexos. Grafos p. 18

Análisis de complejidad El número de vértices siendo n, repetimos DFS por máximo O(n) veces. Cada recorrido toma tiempo O(n+m), pero en cada recorrido se reducen n y m. Efectivamente vamos a visitar cada vértice una vez y recorrir cada arista una vez. Considerando que n O(m) O(n 2 ), tenemos un algoritmo para identificar los componentes conexos en tiempo O(n 2 ). Grafos p. 19

Clasificación de aristas En un grafo conexo, podemos clasificar las aristas según un recorrido DFS: Asignamos al vértice inicial la etiqueta uno. Siempre al visitar a un vértice por la primera vez, le asignamos una etiqueta numérica uno mayor que la última etiqueta asignada. Los vértices llegan a tener etiquetas únicas en [1, n]. La etiqueta obtenida es el número de inicio I(v). Grafos p. 20

Más etiquetas Asignamos otra etiqueta a cada vértice tal que la asignación ocurre cuando todos los vecinos han sido recurridos, empezando de 1. Así el vértice de inicio tendrá la etiqueta n. Estas etiquetas son los números de final F(v). Grafos p. 21

Implementaciones Al ejecutar el algoritmo iterativo, basta con mantener las dos contadores. Al ejecutar el algoritmo recursivo, hay que pasar los valores de las últimas etiquetas asignadas en la llamada recursiva (iniciar con cero y cero). Grafos p. 22

Interpretación Las I(v) definen el orden previo del recorrido. Las F(v) definen el orden posterior del recorrido. Grafos p. 23

Clases de aristas Una arista {v, u} (dirigida) es una arista de árbol si el recorrido primero llegó a u desde v, una arista retrocedente si y sólo si (I(u) > I(v)) (F(u) < F(v)), una arista transversa si y sólo si (I(u) > I(v)) (F(u) > F(v)), y una arista procedente si v es un antepasado de u (solamente tiene sentido para grafos dirigidos). Grafos p. 24

Grafo k-conexo Un grafo no dirigido es k-conexo si de cada vértice hay por lo menos k caminos distintos a cada otro vértice. El requisito de ser distinto puede ser de parte de o los vértices tal que no pueden pasar por los mismos vértices ningunos de los k caminos (inglés: vertex connectivity) o de las aristas tal que no pueden compartir ninguna arista los caminos (inglés: edge connectivity). Grafos p. 25

Vértice de articulación En el sentido de vértices distintos, aplica que la intersección de dos componentes distintos que son ambos 2-conexos consiste por máximo un vértice. Tal vértice se llama un vértice de articulación. Grafos p. 26

Vértice de articulación En el sentido de vértices distintos, aplica que la intersección de dos componentes distintos que son ambos 2-conexos consiste por máximo un vértice. Tal vértice se llama un vértice de articulación. Utilizamos esta definición para llegar a un algoritmo para encontrar los componentes 2-conexos de un grafo no dirigido... Grafos p. 26

Componentes 2-conexos Sea v un vértice de articulación y tengamos un bosque de extensión del grafo. Si v es la raíz de un árbol cubriente, tiene necesariamente por lo menos dos hijos, porque por definición de los vértices de articulación, un recorrido no puede pasar de algún componente a otro sin pasar por v. Si v no es la raíz, por lo menos un ramo de v contiene un componente doblemente conexo (o sea, 2-conexo). De tal ramo no es posible tener una arista retrocedente a ningún antepasado. Grafos p. 27

Distancias de la raíz Hacemos un recorrido y marcamos para cada vértice que tan cerca de la raíz se puede llegar solamente por las aristas de árbol y las aristas retrocedentes: R(v) = mín {I(v)} I(u) u es un antep. de v v o su desc. tiene arista con u Grafos p. 28

Vértices de articulación Un vértice v que no es la raíz es un vértice de articulación si y sólo si tiene un hijo u tal que R(u) I(v). {I(v)} {R(u) u es un hijo de v} R(v) = mín {I(u) {v,u} es una arista retrocedente} De hecho, podemos incorporar en el DFS original la calculación de los R(v) de todos los vértices.. Grafos p. 29

Implementación Para facilitar la implementación, se puede guardad aristas en una pila P al procesarlos. Cuando el algoritmo está de vuelta y encuentra un componente doblemente conexo, las aristas del componente están encima de la pila y se puede quitarlas con facilidad. Grafos p. 30

Procedimiento de inicialización inicio := 0; P := ; para todo v V ; I(v) := 0; para todo v V ; si I(v) = 0 doblementeconexo(v); Grafos p. 31

Procedimiento recursivo procedimiento doblementeconexo(v) inicio := inicio +1; I(v) := inicio; R(v) := I(v) para cada {v,u} E si I(u) = 0 añade {v,u} en P; padre(u) := v; doblementeconexo(u); si R(u) I(v) elimina aristas de P hasta e inclusa {v,v }; R(v) := mín{r(v),r(u)}; en otro caso si u padre(v); R(v) := mín{r(v),i(u)} Grafos p. 32

Análisis El algoritmo visita cada vértice y recorre cada arista. Grafos p. 33

Análisis El algoritmo visita cada vértice y recorre cada arista. El tiempo de procesamiento de un vértice o una arista es constante, O(1). Grafos p. 33

Análisis El algoritmo visita cada vértice y recorre cada arista. El tiempo de procesamiento de un vértice o una arista es constante, O(1). = La complejidad del algoritmo completo es O(n+m). Grafos p. 33

Fuertemente conexo Un grafo dirigido está fuertemente conexo si de cada uno de sus vértices existe un camino dirigido a cada otro vértice. Sus componentes fuertemente conexos son los subgrafos maximales fuertemente conexos. Grafos p. 34

Ejemplo Grafos p. 35

Partición de vértices Los componentes fuertemente conexos de G = (V, E) determinan una partición de los vértices de G a las clases de equivalencia según la relación de clausura reflexiva y transitiva de la relación de aristas E. Las aristas entre los componentes fuertemente conexos determinan una orden parcial en el conjunto de componentes. Ese orden parcial se puede aumentar a un orden lineal por un algoritmo de ordenación topológica. Grafos p. 36

Ordenación topológica Cuando uno realiza un DFS, los vértices de un componente conexo se quedan en el mismo ramo del árbol cubriente. El vértice que queda como la raíz del ramo se dice la raíz del componente. Meta: encontrar las raíces de los componentes según el orden de su F(v). Grafos p. 37

Implementación Al llegar a una raíz v i, su componente está formado por los vértices que fueron visitados en el ramo de v i pero no fueron clasificados a ninguna raíz anterior v 1,...,v i 1. Esto se puede implementar fácilmente con una pila auxiliar P, empujando los vértices en la pila en el orden del DFS y al llegar a una raíz, quitándolos del encima de la pila hasta llegar a la raíz misma. Así nada más el componente está eliminado de la pila. Grafos p. 38

Identificación de las raíces Si el grafo contiene solamente aristas de árbol, cada vértice forma su propio componente. Las aristas procedentes no tienen ningún efecto en los componentes. Para que una vértice pueda pertenecer en el mismo componente con otro vértice, tienen que ser conectados por un camino que contiene aristas retrocedentes o transversas. Grafos p. 39

Ejemplo de tal camino Situaciones en las cuales dos vértices (en gris) pueden pertenecer en el mismo componente fuertemente conexo. Las aristas azules son retrocedentes y las aristas verdes transversas. Las aristas de árbol están dibujados en negro y otros vértices (del mismo componente) en blanco. Grafos p. 40

La búsqueda de las raíces Utilizamos un arreglo auxiliar A(v) para guadrar un número para cáda vértice encontrado: A(v) = mín{{i(v)} w que es desc. de v tal que I(v ) {w,u} es retroced. o transv. raíz del comp. de u es un antep. de v Grafos p. 41

Ejemplo de la ecuación v u w La raíz del componente está dibujado en gris y la flecha no continua es un camino, no necesariamente una arista directa. Grafos p. 42

Formulación recursiva Si A(v) = I(v), sabemos que v es una raíz de un componente. v V : A(v) < I(v), porque A(v) contiene el valor del I(v) de un vértice anteriormente recorrido por una arista retrocedente o transversa o alternativamente un valor de A(v) está pasado a v por un descendiente. { A(v) = mín {I(v)} {A(u) u es hijo de v} {I(u) {v,u} es retrocedente o transversa la raíz del compo. de u es un antep. de v} }. Grafos p. 43

Implementación Durante la ejecución el algoritmo, en la pila auxiliar P habrá vértices los componentes de los cuales no han sido determinados todavía. Para facilitar el procesamiento, mantenemos un arreglo de indicadores: g(v) = verdadero si v está en la pila auxiliar y falso en otro caso. Así podemos determinar en el momento de procesar una arista retrocedente o transversa {v,u} si la raíz de u es un antepasado de v. Si lo es, u está en el mismo componente con v y los dos vértices v y la raíz están todavía en la pila. Grafos p. 44

main(v, E) a := 0; I(v) := 0; P := ; para todo v V haz I(v) := 0; g(v) := falso para todo v V si I(v) = 0 fuerteconexo(v) Grafos p. 45

fuerteconexo(v) a := a+1; I(v) := a; A(v) := I(v); empuja v en P; g[v] := verdadero ; para todo {v,u} E haz si I(u) = 0 fuerteconexo(u); A(v) := mín{a(v), A(u)}; en otro caso si I(u) < I(v) g(u) = verdadero A(v) := mín{a(v),i(u)}; si A(v) = I(v) quita de P un w hasta e incluso v; g(w) := falso ; imprime w como miembro de compo. de v; Grafos p. 46

Análisis Cada vértice entra la pila P una vez y sale una vez. Adicionamente hay que procesar cada arista. La computación por vértice o arista es de tiempo constante. = O(n+m) Grafos p. 47

Búsqueda en anchura (BFS) 1. crea una cola vacía L 2. asigna u := v 3. marca u visitado 4. añade cada vértice no marcado en Γ(v) al fin de L 5. si L está vacía, termina 6. asigna u := el primer vértice en L 7. continua de paso (3) Grafos p. 48

Usos de BFS búsqueda distancias detección de ciclos componentes conexos detección de grafos bipartitos Grafos p. 49

Tarea para entregar el martes Diseña basado en BFS y expresa en pseudocódigo algoritmos para los siguientes problemas: 1. Calcular las distancias del vértice v a los otros vértices en un grafo dado G. 2. Determinar si un dado grafo G es cíclico. 3. Determinar si un dado grafo G es bipartito. 4. Colorear un dado grafo G con 2 colores, si es posible. Grafos p. 50