Tema #6 Estructura de datos generales - sebas-mora28/Algoritmos_Estructuras_Datos_I GitHub Wiki

  • Los grafos son estructuras de datos generales aplicables en muchas áreas como:

        * Sociología 
        * Química
        * Geografía 
        * Criminología 
    
  • Un grafo G agrupa entidades que representan conceptos.

  • Se compone de vértices/nodos que representan cada entidad y de aristas/arcos que representan relacionados entre los nodos.

Grafo

  • Un grupo puede ser dirigido o no dirigido. El ejemplo anterior es un grafo no dirigido. El siguiente es un grafo dirigido.

Grado dirigido

  • Los arcos pueden tener magnitud, creando un grafo con peso:

Arcos

  • El grado de un nodo es la cantidad de conexiones en las que participa. Por ejemplo:

    • Cartago = 5
  • En un grafo dirigido hay grafo saliente y entrante.

Conexiones

  • Un camino P={V, V1, V2,..., Vn} es el conjunto de vértices que conectan V0-->Vn

  • Un ciclo es un camino que empieza y termina en el mismo nodo.

  • Un grafo es acíclico si no tiene ciclos.

  • Un DAG(Directed Acyclic Graph) es un nodo dirigido sin ciclos

¿ Cómo se implementar un grafo?

  • Hay dos formas:

         * Matriz de la adyacente
         * Lista de adyacentes
    

Matriz de adyacencia

  • Dadi un grafo de n vértices, se constituye una matriz de nxn donde cada elemento a(i,j) tiene uno de los siguientes valores:

     * 1 si hay arco de Vi-Vj
     * 0 en caso contario 
    
  • Una lista de adyacencia es una lista enlazada donde cada elemento es un nodo de grafos. Cada elemento tiene una lista con sus conexiones

Matriz adyacente

  • Si el grafo tuviera pesos en vez de 1 se pondrá el peso y en vez de 0, se pondrá infinito.

  • Una lista de adyacencia es una lista enlazada donde cada elemento es un nodo de grafos. Cada elemento tiene una lista con sus conexiones.

  • Elegir entre uno y otra forma depende de:

          - Algoritmos por aplicar
          - Densidad del grafo
          - ALTA-Matriz
          - BAJA-lista
    

¿ Cómo se implementar un grafo?

  • Se recorre desde un nodo específico y hasta recorrer todos los nodos alcanzable.
  • Recorrido por archura: (FiFo)

Recorrido por anchura

  • Por profundidad: (LiFo

Recorrido por profundidad

La ruta más corta entre un nodo y otro

  • Es uno de los problemas más comunes de los grafos

  • Edgar Dijskta propone un algoritmo que calcula la ruta más corta.

                      * Grafo por peso
                      * Grafo dirigido 
    

Pasos

  • Asignar a todos los nodos infinito menos al inicial

  • Calcular el valor a todos los nodos a partir de A.

  • Selecciona el nodo menor y nos movemos a este. Se recalcula las distancias usando el nuevo nodo como "puente".

  • Se sigue seleccionando el menor no visitado y se recalcula.

Algoritmo de Washall ( Cierre transitivo)

  • Permite determinar si hay camino entre cualquier par de nodos del grafo.

  • Calcule la matriz de caminos de un grafo G de n vértices representando la matriz de adyacencia A

  • Define una secuencia de matrices Po, P1,...,Pn. Los elementos de cada matriz Pk[i,j] tienen un cero si no hay camino, o 1 si hay camino de Vi a V, através de Vk.

P0 1 2 3 4 5
1 1 1 0 0 0
2 0 1 0 1 1
3 1 1 1 0 1
4 1 0 0 1 1
5 0 0 0 1 1
  • A partir de la matriz Pk-1
P1 1 2 3 4 5
1 1 1 0 0 0
2 0 1 0 1 1
3 1 1 1 0 1
4 1 1 0 1 1
5 0 0 0 1 1
* Hay camino de V4 a V2 a través de V1
P2 1 2 3 4 5
1 1 1 0 1 1
2 0 1 0 1 1
3 1 1 1 1 1
4 1 1 0 1 1
5 0 0 0 1 1
* Así sucesivamente hasta llegar a P5

Algoritmo de camino más corto para todos los vértices

  • Se podría aplicarDijkstra para todos los vértices pero sería ineficiente.

  • El agoritmo de FLoyd-Washall es más directo para calcular los rutas óptimas para todos los vértices.

  • El grafo se representa con la matriz de pesos. Si no hay arco/ arista se conserva infinito.

  • La diagonal es infinito.

  • Al igual que Warshall, genera n matrices de nxn. En cada paso, se incorpora un nuevo vértice y se evalúa a ratos.

  • De igual forma, se generan n matrices predecesoras.

       Wo[i,j]   ----> Cij peso del arco de V1 A v
                  ----> inf si no hay arco 
    

W1[i,j] = mínimo ( D0[i,j], D0[i,1], D0[1 ,j])

WK[i,j] = min ( Dk-1[i,j], Dk-1[i,k] + Dk-1[k,j])