SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Grafos

Apoyo SSD5
Grafos en el Mundo Real
Existen muchos ejemplos de grafos en el
mundo real.
Tu puedes estar usando precisamente
ahora, uno de estos ejemplos, Internet.
Las redes interconectadas que forman
Internet son ejemplos comunes de un
grafo.


                Mtl Lourdes Cahuich       2
Grafos en el Mundo Real
Las computadoras forman los nodos del
grafo.
Como no toda máquina está conectada a
cualquier otra máquina, estas ligas entre
máquinas también son parte del grafo.




                 Mtl Lourdes Cahuich        3
Grafos en el Mundo Real
Cada liga entre un par de computadoras
puede ser directa o indirecta, dependiendo
de si los mensajes pueden ser enviados
solamente en una dirección o en ambas.




                Mtl Lourdes Cahuich      4
Mtl Lourdes Cahuich   5
Definición de Grafos
Un grafo dirigido consiste en un conjunto
V de vértices o nodos y un conjunto E de
aristas (edges).
Cada arista tiene un nodo origen y un
nodo destino, y la arista puede ser
recorrida solamente de origen al destino.



                 Mtl Lourdes Cahuich        6
Mtl Lourdes Cahuich   7
Definición de Grafos
Muchas de las operaciones básicas de un
grafo, giran alrededor de la existencia de
una ruta (path).
Una ruta es cualquier secuencia de nodos
conectados por las aristas.
El número de aristas en una ruta es la
longitud de la ruta


                 Mtl Lourdes Cahuich         8
Definición de Grafos
Por lo general, uno se enfrenta con grafos
no dirigidos en donde cada arista puede
ser recorrida en cualquier dirección.
Una arista no dirigida puede ser vista
como un par de aristas dirigidas, por lo
que nos enfocaremos en el caso dirigido



                 Mtl Lourdes Cahuich         9
Mtl Lourdes Cahuich   10
Definición de Grafos
Tal vez la característica más atractiva de
los grafos es que éstos pueden ser
identificados visualmente, y las imágenes
de grafos son a menudo útiles para
motivar y describir propiedades
importantes.



                 Mtl Lourdes Cahuich         11
Definición de Grafos
Los algoritmos de grafos usualmente se
entienden mejor junto con algún dibujo
que muestra lo que el algoritmo realiza.




                 Mtl Lourdes Cahuich       12
Algoritmos fundamentales
        de grafos
Búsqueda por Niveles
      (Breadth-First Search)
Un algoritmo búsqueda por niveles,
también conocido como búsqueda por
anchura (breadth-first search) es un
algoritmo que explora los nodos en un
grafo en el orden de la distancia de
aumento desde el nodo inicial.



                Mtl Lourdes Cahuich     14
Mtl Lourdes Cahuich   15
Búsqueda por Niveles
El algoritmo inicia examinando cada una
de las aristas salientes de este nodo
inicial.
Se van descubriendo nuevos nodos
cuando el algoritmo examina estas aristas
salientes.



                Mtl Lourdes Cahuich     16
Mtl Lourdes Cahuich   17
Búsqueda por Niveles
Estos nodos quot;descubiertosquot; son colocados
dentro de una cola.
Luego el algoritmo de búsqueda por
niveles, examina cada nodo descubierto
para determinar si se pueden alcanzar
nuevos nodos desde el nodo descubierto.



                Mtl Lourdes Cahuich    18
Búsqueda por Niveles
Una vez que un nodo ha sido descubierto,
éste es colocado dentro de una cola de
nodos que han sido descubiertos, pero no
explorados.
Luego el algoritmo termina de explorar el
nodo inicial, examinando su arista
restante.


                Mtl Lourdes Cahuich     19
Búsqueda por Niveles
Un nodo está completamente explorado
cuando todas sus aristas han sido
examinadas.
Cuando la exploración de un nodo se
completa, el algoritmo selecciona otro
nodo para ser explorado.



                Mtl Lourdes Cahuich      20
Búsqueda por Niveles
El algoritmo finalmente termina cuando se
queda sin nodos que requieran ser
explorados.




                Mtl Lourdes Cahuich     21
Implantación del algoritmo

     Búsqueda por Niveles
void bfs(vector< list<int> >& adj_lists, int start_node) {
  queue<int> not_yet_explored;
  set<int> discovered;
  // Mark the start node as being discovered,
  // and place it in the queue of nodes to explore
  not_yet_explored.push(start_node);
  discovered.insert(start_node);
  while (! not_yet_explored.empty()) {
     // Get a node to explore.
      int node_to_explore = not_yet_explored.front();
      not_yet_explored.pop();
       // Examine all the edges of the node
      list<int>::iterator edges = adj_lists[node_to_explore].begin();

                              Mtl Lourdes Cahuich                23
for ( ; edges != adj_lists[node_to_explore].end(); edges++) {
         // See if the edge leads to a node that we
         // have not yet discovered
         if (discovered.count(*edges) == 0) {
             // We have discovered a new node!
             // Add this node to the queue of nodes
             // to explore.
             discovered.insert(*edges);
             not_yet_explored.push(*edges);
             cout << quot;Found quot; << *edges <<
             quot; from quot; << node_to_explore << endl;
         }
       }
   }}
                           Mtl Lourdes Cahuich                  24
Búsqueda por Profundidad
Un algoritmo búsqueda por profundidad
(depth-first search) es un algoritmo que
explora los nodos en un grafo, en orden
inverso de la distancia de aumento desde
el nodo inicial.




                Mtl Lourdes Cahuich        25
Búsqueda por Profundidad
Un algoritmo de búsqueda por
profundidad explora los nodos más
profundos del grafo y luego trabaja de
regreso hacia los nodos que están más
cercanos al nodo inicial




                Mtl Lourdes Cahuich      26
Búsqueda por Profundidad
Para buscar profundamente en un
laberinto, primero, el algoritmo de
búsqueda por profundidad mantiene un
registro de los nodos a ser explorados en
una pila, en vez de una cola.
Esto causa que los nodos descubiertos
más recientemente sean explorados antes
que los nodos previamente descubiertos.

                Mtl Lourdes Cahuich     27
Búsqueda por Profundidad
En una búsqueda por niveles, exploramos
los nodos en el orden en que los
descubrimos.
En una búsqueda por profundidad,
exploramos los nodos conforme los vamos
descubriendo



               Mtl Lourdes Cahuich    28
Mtl Lourdes Cahuich   29
Implantación del algoritmo

    Búsqueda por Profundidad
Implantación - Búsqueda por
          Profundidad
La implantación de un algoritmo de
búsqueda por profundidad difiere de la
implantación de uno de búsqueda por
niveles solamente en el contenedor usado
para almacenar los nodos que no han sido
explorados.



                Mtl Lourdes Cahuich    31
Implantación - Búsqueda por
          Profundidad
Un algoritmo de búsqueda por
profundidad siempre explora el nodo
descubierto más recientemente.
Para facilitar esto, los elementos que no
han sido explorados se almacenan en una
pila en vez de una cola



                Mtl Lourdes Cahuich     32
void dfs_helper(vector<
 list<int> >& adj_lists,
 set<int>& discovered, int node) {
  // Examine all the edges of the node
  list<int>::iterator
  edges = adj_lists[node].begin();
   for ( ; edges !=
         adj_lists[node].end();
         edges++) {
    // See if the edge leads to a node that we
    // have not yet discovered
                   Mtl Lourdes Cahuich     33
if (discovered.count(*edges) == 0) {
        // We have discovered a new node!
       // Add this node to the queue of nodes
       // to explore.
       discovered.insert(*edges);
       cout << quot;Found quot; << *edges <<
               quot; from quot; << node << endl;
       dfs_helper(adj_lists,
                 discovered, *edges);
   }
}}

                     Mtl Lourdes Cahuich        34
void dfs(vector< list<int> >&
 adj_lists, int start_node) {
    // Mark the start node as being discovered
    set<int> discovered;
    discovered.insert(start_node);
    dfs_helper(adj_lists,
           discovered, start_node);
}


                   Mtl Lourdes Cahuich      35
Cálculo de la Ruta Más Corta
Los cálculos de la ruta más corta son una
familia de algoritmos que determinan la
distancia más corta entre nodos de un
grafo.
Existen diferentes algoritmos de ruta más
corta, debido a que diferentes tipos de
grafos requieren enfoques un poco
diferentes.

                Mtl Lourdes Cahuich         36
Cálculo de la Ruta Más Corta
En un grafo no ponderado, por ejemplo,
se puede usar simplemente una búsqueda
por niveles para calcular la distancia más
corta entre nodos.
Para grafos ponderados, se deben utilizar
algoritmos diferentes y un poco más
complejos.


                Mtl Lourdes Cahuich      37
Cálculo de la Ruta Más Corta
Podemos usar el algoritmo Dijkstra si
todos los pesos o valores en un grafo
ponderado son positivos.
Un algoritmo conocido como Bellman-Ford
resuelve el problema de la ruta más corta
para grafos que contienen aristas con
valores negativos


                Mtl Lourdes Cahuich     38

Más contenido relacionado

La actualidad más candente

Diagnóstico de fallas utilizando un algoritmo basado en Redes de Petri
Diagnóstico de fallas utilizando un algoritmo basado en Redes de PetriDiagnóstico de fallas utilizando un algoritmo basado en Redes de Petri
Diagnóstico de fallas utilizando un algoritmo basado en Redes de PetriAlex Arredondo
 
La maquina de Turing, sus tipos y aplicaciones.
La maquina de Turing, sus tipos y aplicaciones.La maquina de Turing, sus tipos y aplicaciones.
La maquina de Turing, sus tipos y aplicaciones.Emmanuel Colon
 
Que es una red petri
Que es una red petriQue es una red petri
Que es una red petriLucero Mtz
 
Búsqueda no informada - Búsqueda bidireccional
Búsqueda no informada - Búsqueda  bidireccionalBúsqueda no informada - Búsqueda  bidireccional
Búsqueda no informada - Búsqueda bidireccionalLaura Del Pino Díaz
 
Clasificación de las máquinas de turing
Clasificación de las máquinas de turingClasificación de las máquinas de turing
Clasificación de las máquinas de turingJonathan Bastidas
 
Definicion y Funcionamiento de Maquina de Turing
Definicion y Funcionamiento de Maquina de TuringDefinicion y Funcionamiento de Maquina de Turing
Definicion y Funcionamiento de Maquina de Turinglourdesnbv
 

La actualidad más candente (9)

Diagnóstico de fallas utilizando un algoritmo basado en Redes de Petri
Diagnóstico de fallas utilizando un algoritmo basado en Redes de PetriDiagnóstico de fallas utilizando un algoritmo basado en Redes de Petri
Diagnóstico de fallas utilizando un algoritmo basado en Redes de Petri
 
La maquina de Turing, sus tipos y aplicaciones.
La maquina de Turing, sus tipos y aplicaciones.La maquina de Turing, sus tipos y aplicaciones.
La maquina de Turing, sus tipos y aplicaciones.
 
Maquina de turing
Maquina de turingMaquina de turing
Maquina de turing
 
Que es una red petri
Que es una red petriQue es una red petri
Que es una red petri
 
Búsqueda no informada - Búsqueda bidireccional
Búsqueda no informada - Búsqueda  bidireccionalBúsqueda no informada - Búsqueda  bidireccional
Búsqueda no informada - Búsqueda bidireccional
 
Redes petri
Redes petriRedes petri
Redes petri
 
Compuertas lógicas
Compuertas lógicasCompuertas lógicas
Compuertas lógicas
 
Clasificación de las máquinas de turing
Clasificación de las máquinas de turingClasificación de las máquinas de turing
Clasificación de las máquinas de turing
 
Definicion y Funcionamiento de Maquina de Turing
Definicion y Funcionamiento de Maquina de TuringDefinicion y Funcionamiento de Maquina de Turing
Definicion y Funcionamiento de Maquina de Turing
 

Similar a 20 Grafos

Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.Bryan Aguilar Yaguana
 
Tema 5 diapositivas de la teoría de grafos.pptx
Tema 5 diapositivas de la teoría de grafos.pptxTema 5 diapositivas de la teoría de grafos.pptx
Tema 5 diapositivas de la teoría de grafos.pptxAndreFurios
 
grafosalgoritmosfundamentales-170507070811.pdf
grafosalgoritmosfundamentales-170507070811.pdfgrafosalgoritmosfundamentales-170507070811.pdf
grafosalgoritmosfundamentales-170507070811.pdfEdgardRamirezHuaccha
 
Solución de problemas mediante busqueda
Solución de problemas mediante busquedaSolución de problemas mediante busqueda
Solución de problemas mediante busquedasacrilegetx
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busquedaOsirysRock
 
Tecnicas de Busqueda en IA
Tecnicas de Busqueda en IATecnicas de Busqueda en IA
Tecnicas de Busqueda en IARafaelVargas155
 
Tecnicas de Busqueda en IA
Tecnicas de Busqueda en IATecnicas de Busqueda en IA
Tecnicas de Busqueda en IAAlfredoAlejo1
 
Algoritmo prim
Algoritmo primAlgoritmo prim
Algoritmo primAbraham
 
Algoritmo de prim
Algoritmo de primAlgoritmo de prim
Algoritmo de primAbraham
 
Algoritmos de ordenación grafos y caminos
Algoritmos de ordenación grafos y caminosAlgoritmos de ordenación grafos y caminos
Algoritmos de ordenación grafos y caminosJeiner Gonzalez Blanco
 
El algoritmo a (asterisco)
El algoritmo a (asterisco)El algoritmo a (asterisco)
El algoritmo a (asterisco)Cristina Lopez
 
Algoritmo de dijkstra
Algoritmo de dijkstraAlgoritmo de dijkstra
Algoritmo de dijkstraKeily Solano
 
Presentación OR Problemas de Caminos Más Cortos
Presentación OR Problemas de Caminos Más CortosPresentación OR Problemas de Caminos Más Cortos
Presentación OR Problemas de Caminos Más CortosRosa E Padilla
 
Análisis de algoritmos
Análisis de algoritmosAnálisis de algoritmos
Análisis de algoritmosDaniel Vasquez
 
3.3 - 2 Búsqueda Sistemática.pptx
3.3 - 2 Búsqueda Sistemática.pptx3.3 - 2 Búsqueda Sistemática.pptx
3.3 - 2 Búsqueda Sistemática.pptxRam Vazquez
 

Similar a 20 Grafos (20)

Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
 
Algoritmo De Dijkstra
Algoritmo De DijkstraAlgoritmo De Dijkstra
Algoritmo De Dijkstra
 
Tema 5 diapositivas de la teoría de grafos.pptx
Tema 5 diapositivas de la teoría de grafos.pptxTema 5 diapositivas de la teoría de grafos.pptx
Tema 5 diapositivas de la teoría de grafos.pptx
 
grafosalgoritmosfundamentales-170507070811.pdf
grafosalgoritmosfundamentales-170507070811.pdfgrafosalgoritmosfundamentales-170507070811.pdf
grafosalgoritmosfundamentales-170507070811.pdf
 
Solución de problemas mediante busqueda
Solución de problemas mediante busquedaSolución de problemas mediante busqueda
Solución de problemas mediante busqueda
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busqueda
 
Tecnicas de Busqueda en IA
Tecnicas de Busqueda en IATecnicas de Busqueda en IA
Tecnicas de Busqueda en IA
 
Tecnicas de Busqueda en IA
Tecnicas de Busqueda en IATecnicas de Busqueda en IA
Tecnicas de Busqueda en IA
 
Problema de las 8 reinas
Problema de las 8 reinasProblema de las 8 reinas
Problema de las 8 reinas
 
Flujo en redes
Flujo en redesFlujo en redes
Flujo en redes
 
Algoritmo a*
Algoritmo a*Algoritmo a*
Algoritmo a*
 
Algoritmo prim
Algoritmo primAlgoritmo prim
Algoritmo prim
 
Algoritmo de prim
Algoritmo de primAlgoritmo de prim
Algoritmo de prim
 
Actividad #7, subgrupo #4
Actividad #7, subgrupo #4Actividad #7, subgrupo #4
Actividad #7, subgrupo #4
 
Algoritmos de ordenación grafos y caminos
Algoritmos de ordenación grafos y caminosAlgoritmos de ordenación grafos y caminos
Algoritmos de ordenación grafos y caminos
 
El algoritmo a (asterisco)
El algoritmo a (asterisco)El algoritmo a (asterisco)
El algoritmo a (asterisco)
 
Algoritmo de dijkstra
Algoritmo de dijkstraAlgoritmo de dijkstra
Algoritmo de dijkstra
 
Presentación OR Problemas de Caminos Más Cortos
Presentación OR Problemas de Caminos Más CortosPresentación OR Problemas de Caminos Más Cortos
Presentación OR Problemas de Caminos Más Cortos
 
Análisis de algoritmos
Análisis de algoritmosAnálisis de algoritmos
Análisis de algoritmos
 
3.3 - 2 Búsqueda Sistemática.pptx
3.3 - 2 Búsqueda Sistemática.pptx3.3 - 2 Búsqueda Sistemática.pptx
3.3 - 2 Búsqueda Sistemática.pptx
 

Más de UVM

Tiempo compartido en programación
Tiempo compartido en programaciónTiempo compartido en programación
Tiempo compartido en programaciónUVM
 
Portafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaPortafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaUVM
 
Eficiencia en uso tiempo
Eficiencia en uso  tiempoEficiencia en uso  tiempo
Eficiencia en uso tiempoUVM
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosUVM
 
Practica de arreglos
Practica de arreglosPractica de arreglos
Practica de arreglosUVM
 
Otra introducción a apuntadores
Otra introducción a apuntadoresOtra introducción a apuntadores
Otra introducción a apuntadoresUVM
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlUVM
 
Breve repaso de apuntadores
Breve repaso de apuntadoresBreve repaso de apuntadores
Breve repaso de apuntadoresUVM
 
Arreglos conceptos básicos
Arreglos conceptos básicosArreglos conceptos básicos
Arreglos conceptos básicosUVM
 
Resolución práctica de tipos de datos
Resolución práctica de tipos de datosResolución práctica de tipos de datos
Resolución práctica de tipos de datosUVM
 
Resumen de funciones
Resumen de funcionesResumen de funciones
Resumen de funcionesUVM
 
Biblioteca estándar de funciones
Biblioteca estándar de funcionesBiblioteca estándar de funciones
Biblioteca estándar de funcionesUVM
 
Manejo de bits
Manejo de bitsManejo de bits
Manejo de bitsUVM
 
Aclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreAclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreUVM
 
Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3UVM
 
Funciones definidas por el usuario
Funciones definidas por el usuarioFunciones definidas por el usuario
Funciones definidas por el usuarioUVM
 
Función main()
Función main()Función main()
Función main()UVM
 
Depuración de un programa en c++
Depuración de un programa en c++Depuración de un programa en c++
Depuración de un programa en c++UVM
 
Algunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoAlgunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoUVM
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++UVM
 

Más de UVM (20)

Tiempo compartido en programación
Tiempo compartido en programaciónTiempo compartido en programación
Tiempo compartido en programación
 
Portafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaPortafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación Avanzada
 
Eficiencia en uso tiempo
Eficiencia en uso  tiempoEficiencia en uso  tiempo
Eficiencia en uso tiempo
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicos
 
Practica de arreglos
Practica de arreglosPractica de arreglos
Practica de arreglos
 
Otra introducción a apuntadores
Otra introducción a apuntadoresOtra introducción a apuntadores
Otra introducción a apuntadores
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stl
 
Breve repaso de apuntadores
Breve repaso de apuntadoresBreve repaso de apuntadores
Breve repaso de apuntadores
 
Arreglos conceptos básicos
Arreglos conceptos básicosArreglos conceptos básicos
Arreglos conceptos básicos
 
Resolución práctica de tipos de datos
Resolución práctica de tipos de datosResolución práctica de tipos de datos
Resolución práctica de tipos de datos
 
Resumen de funciones
Resumen de funcionesResumen de funciones
Resumen de funciones
 
Biblioteca estándar de funciones
Biblioteca estándar de funcionesBiblioteca estándar de funciones
Biblioteca estándar de funciones
 
Manejo de bits
Manejo de bitsManejo de bits
Manejo de bits
 
Aclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreAclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembre
 
Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3
 
Funciones definidas por el usuario
Funciones definidas por el usuarioFunciones definidas por el usuario
Funciones definidas por el usuario
 
Función main()
Función main()Función main()
Función main()
 
Depuración de un programa en c++
Depuración de un programa en c++Depuración de un programa en c++
Depuración de un programa en c++
 
Algunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoAlgunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agosto
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++
 

20 Grafos

  • 2. Grafos en el Mundo Real Existen muchos ejemplos de grafos en el mundo real. Tu puedes estar usando precisamente ahora, uno de estos ejemplos, Internet. Las redes interconectadas que forman Internet son ejemplos comunes de un grafo. Mtl Lourdes Cahuich 2
  • 3. Grafos en el Mundo Real Las computadoras forman los nodos del grafo. Como no toda máquina está conectada a cualquier otra máquina, estas ligas entre máquinas también son parte del grafo. Mtl Lourdes Cahuich 3
  • 4. Grafos en el Mundo Real Cada liga entre un par de computadoras puede ser directa o indirecta, dependiendo de si los mensajes pueden ser enviados solamente en una dirección o en ambas. Mtl Lourdes Cahuich 4
  • 6. Definición de Grafos Un grafo dirigido consiste en un conjunto V de vértices o nodos y un conjunto E de aristas (edges). Cada arista tiene un nodo origen y un nodo destino, y la arista puede ser recorrida solamente de origen al destino. Mtl Lourdes Cahuich 6
  • 8. Definición de Grafos Muchas de las operaciones básicas de un grafo, giran alrededor de la existencia de una ruta (path). Una ruta es cualquier secuencia de nodos conectados por las aristas. El número de aristas en una ruta es la longitud de la ruta Mtl Lourdes Cahuich 8
  • 9. Definición de Grafos Por lo general, uno se enfrenta con grafos no dirigidos en donde cada arista puede ser recorrida en cualquier dirección. Una arista no dirigida puede ser vista como un par de aristas dirigidas, por lo que nos enfocaremos en el caso dirigido Mtl Lourdes Cahuich 9
  • 11. Definición de Grafos Tal vez la característica más atractiva de los grafos es que éstos pueden ser identificados visualmente, y las imágenes de grafos son a menudo útiles para motivar y describir propiedades importantes. Mtl Lourdes Cahuich 11
  • 12. Definición de Grafos Los algoritmos de grafos usualmente se entienden mejor junto con algún dibujo que muestra lo que el algoritmo realiza. Mtl Lourdes Cahuich 12
  • 14. Búsqueda por Niveles (Breadth-First Search) Un algoritmo búsqueda por niveles, también conocido como búsqueda por anchura (breadth-first search) es un algoritmo que explora los nodos en un grafo en el orden de la distancia de aumento desde el nodo inicial. Mtl Lourdes Cahuich 14
  • 16. Búsqueda por Niveles El algoritmo inicia examinando cada una de las aristas salientes de este nodo inicial. Se van descubriendo nuevos nodos cuando el algoritmo examina estas aristas salientes. Mtl Lourdes Cahuich 16
  • 18. Búsqueda por Niveles Estos nodos quot;descubiertosquot; son colocados dentro de una cola. Luego el algoritmo de búsqueda por niveles, examina cada nodo descubierto para determinar si se pueden alcanzar nuevos nodos desde el nodo descubierto. Mtl Lourdes Cahuich 18
  • 19. Búsqueda por Niveles Una vez que un nodo ha sido descubierto, éste es colocado dentro de una cola de nodos que han sido descubiertos, pero no explorados. Luego el algoritmo termina de explorar el nodo inicial, examinando su arista restante. Mtl Lourdes Cahuich 19
  • 20. Búsqueda por Niveles Un nodo está completamente explorado cuando todas sus aristas han sido examinadas. Cuando la exploración de un nodo se completa, el algoritmo selecciona otro nodo para ser explorado. Mtl Lourdes Cahuich 20
  • 21. Búsqueda por Niveles El algoritmo finalmente termina cuando se queda sin nodos que requieran ser explorados. Mtl Lourdes Cahuich 21
  • 22. Implantación del algoritmo Búsqueda por Niveles
  • 23. void bfs(vector< list<int> >& adj_lists, int start_node) { queue<int> not_yet_explored; set<int> discovered; // Mark the start node as being discovered, // and place it in the queue of nodes to explore not_yet_explored.push(start_node); discovered.insert(start_node); while (! not_yet_explored.empty()) { // Get a node to explore. int node_to_explore = not_yet_explored.front(); not_yet_explored.pop(); // Examine all the edges of the node list<int>::iterator edges = adj_lists[node_to_explore].begin(); Mtl Lourdes Cahuich 23
  • 24. for ( ; edges != adj_lists[node_to_explore].end(); edges++) { // See if the edge leads to a node that we // have not yet discovered if (discovered.count(*edges) == 0) { // We have discovered a new node! // Add this node to the queue of nodes // to explore. discovered.insert(*edges); not_yet_explored.push(*edges); cout << quot;Found quot; << *edges << quot; from quot; << node_to_explore << endl; } } }} Mtl Lourdes Cahuich 24
  • 25. Búsqueda por Profundidad Un algoritmo búsqueda por profundidad (depth-first search) es un algoritmo que explora los nodos en un grafo, en orden inverso de la distancia de aumento desde el nodo inicial. Mtl Lourdes Cahuich 25
  • 26. Búsqueda por Profundidad Un algoritmo de búsqueda por profundidad explora los nodos más profundos del grafo y luego trabaja de regreso hacia los nodos que están más cercanos al nodo inicial Mtl Lourdes Cahuich 26
  • 27. Búsqueda por Profundidad Para buscar profundamente en un laberinto, primero, el algoritmo de búsqueda por profundidad mantiene un registro de los nodos a ser explorados en una pila, en vez de una cola. Esto causa que los nodos descubiertos más recientemente sean explorados antes que los nodos previamente descubiertos. Mtl Lourdes Cahuich 27
  • 28. Búsqueda por Profundidad En una búsqueda por niveles, exploramos los nodos en el orden en que los descubrimos. En una búsqueda por profundidad, exploramos los nodos conforme los vamos descubriendo Mtl Lourdes Cahuich 28
  • 30. Implantación del algoritmo Búsqueda por Profundidad
  • 31. Implantación - Búsqueda por Profundidad La implantación de un algoritmo de búsqueda por profundidad difiere de la implantación de uno de búsqueda por niveles solamente en el contenedor usado para almacenar los nodos que no han sido explorados. Mtl Lourdes Cahuich 31
  • 32. Implantación - Búsqueda por Profundidad Un algoritmo de búsqueda por profundidad siempre explora el nodo descubierto más recientemente. Para facilitar esto, los elementos que no han sido explorados se almacenan en una pila en vez de una cola Mtl Lourdes Cahuich 32
  • 33. void dfs_helper(vector< list<int> >& adj_lists, set<int>& discovered, int node) { // Examine all the edges of the node list<int>::iterator edges = adj_lists[node].begin(); for ( ; edges != adj_lists[node].end(); edges++) { // See if the edge leads to a node that we // have not yet discovered Mtl Lourdes Cahuich 33
  • 34. if (discovered.count(*edges) == 0) { // We have discovered a new node! // Add this node to the queue of nodes // to explore. discovered.insert(*edges); cout << quot;Found quot; << *edges << quot; from quot; << node << endl; dfs_helper(adj_lists, discovered, *edges); } }} Mtl Lourdes Cahuich 34
  • 35. void dfs(vector< list<int> >& adj_lists, int start_node) { // Mark the start node as being discovered set<int> discovered; discovered.insert(start_node); dfs_helper(adj_lists, discovered, start_node); } Mtl Lourdes Cahuich 35
  • 36. Cálculo de la Ruta Más Corta Los cálculos de la ruta más corta son una familia de algoritmos que determinan la distancia más corta entre nodos de un grafo. Existen diferentes algoritmos de ruta más corta, debido a que diferentes tipos de grafos requieren enfoques un poco diferentes. Mtl Lourdes Cahuich 36
  • 37. Cálculo de la Ruta Más Corta En un grafo no ponderado, por ejemplo, se puede usar simplemente una búsqueda por niveles para calcular la distancia más corta entre nodos. Para grafos ponderados, se deben utilizar algoritmos diferentes y un poco más complejos. Mtl Lourdes Cahuich 37
  • 38. Cálculo de la Ruta Más Corta Podemos usar el algoritmo Dijkstra si todos los pesos o valores en un grafo ponderado son positivos. Un algoritmo conocido como Bellman-Ford resuelve el problema de la ruta más corta para grafos que contienen aristas con valores negativos Mtl Lourdes Cahuich 38