Está en la página 1de 8

Algoritmo de Dijkstra

El algoritmo de Dijkstra, también llamado “algoritmo de caminos


mínimos”, es unalgoritmo para la determinación del camino más corto dado
un vértice origen al resto de vértices en un grafo con pesos en cada arista. Su
nombre se refiere a Edsger Dijkstra, quien lo describió por primera vez en 1959.
La idea subyacente en este algoritmo consiste en ir explorando todos los caminos
más cortos que parten del vértice origen y que llevan a todos los demás vértices;
cuando se obtiene el camino más corto desde el vértice origen, al resto de vértices
que componen el grafo, el algoritmo se detiene. El algoritmo es una especialización
de la búsqueda de costo uniforme, y como tal, no funciona en grafos con aristas de
costo negativo (al elegir siempre el nodo con distancia menor, pueden quedar
excluidos de la búsqueda nodos que en próximas iteraciones bajarían el costo
general del camino al pasar por una arista con costo negativo).

Pasos :

Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el nodo inicial,


un vector D de tamaño N guardará al final del algoritmo las distancias desde x al
resto de los nodos.

1. Inicializar todas las distancias en D con un valor infinito relativo ya que


son desconocidas al principio, exceptuando la de x que se debe colocar en
0 debido a que la distancia de x a x sería 0.
2. Sea a = x (tomamos a como nodo actual).
3. Recorremos todos los nodos adyacentes de a, excepto los nodos
marcados, llamaremos a estos v . i

4. Si la distancia desde x hasta v  guardada en D es mayor que la distancia


i

desde x hasta a, sumada a la distancia desde a hasta v ; esta se sustituye


i

con la segunda nombrada, esto es:


si (D  > D  + d(a, v )) entonces D  = D  + d(a, v )
i a i i a i

5. Marcamos como completo el nodo a.


6. Tomamos como próximo nodo actual el de menor valor en D (puede
hacerse almacenando los valores en una cola de prioridad) y volvemos al
paso 3 mientras existan nodos no marcados.
Una vez terminado al algoritmo, D estará completamente lleno.

Pseudocodigo para programar :

   DIJKSTRA (Grafo G, nodo_fuente s)
para u ∈ V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
distancia[s] = 0
adicionar (cola, (s,distance[s]))
mientras que cola no es vacía hacer
u = extraer_minimo(cola)
para v ∈ adyacencia[u] hacer
si distancia[v] > distancia[u] + peso (u, v) hacer
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
adicionar(cola,(v,distance[v]))
Para consultar mas información :

Fuente : http://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra

Algoritmo de Ford-Fulkerson
El algoritmo de Ford-Fulkerson propone buscar caminos en los que se pueda
aumentar el flujo, hasta que se alcance el flujo máximo. Es aplicable a los Flujos
maximales. La idea es encontrar una ruta de penetración con un flujo positivo neto
que una los nodos origen y destino. Su nombre viene dado por sus creadores, L. R.
Ford, Jr. y D. R. Fulkerson.
 Ford-Fulkerson

Algoritmo de flujo máximo


Tenemos el conocido problema de flujo máximo o maximal: ¿cuál es la tasa mayor
a la cual el material puede ser transportado de la fuente al sumidero sin violar
ninguna restricción de capacidad?

En otras palabras, el problema consiste en determinar la máxima capacidad de


flujo que puede ingresar a través de la fuente y salir por el nodo de destino.

El procedimiento para obtener el flujo máximo de una red, consiste en seleccionar


repetidas veces cualquier trayectoria de la fuente al destino y asignar el flujo
máximo posible en esa trayectoria.

Capacidad residual: es la capacidad adicional de flujo que un arco puede llevar:


 Dada una red de flujo máximo, plantee la red residual asociada.
 Encuentre la trayectoria de la fuente al destino con capacidad
de flujo estrictamente positivo (si no existe alguno, es por que se ha
encontrado el óptimo).
 Examine estas trayectorias para encontrar la rama o arco con la menor
capacidad de flujo restante e incremente en éste valor, la capacidad del
flujo en sentido contrario.
 Determine todas las trayectorias estrictamente positivas, hasta que no se
permita flujo del nodo a un nodo destino.
Podemos, mediante el Algoritmo de Ford-Fulkerson, encontrar el flujo máximo de
una red.
·         Ejemplo de flujo máximo

Para el presente ejemplo, construiremos una grafo con las siguientes matrices de
datos para los valores mínimo, máximo y coste de los arcos:

Matriz de mínimo:

N1\N2    s        1        2        3        4        t

s                12               11              

1                         12       0               

2                                  0                19

3                0                         11      

4                         7                         4

t                                                  

Matriz de máximo:

N1\N2    s        1        2        3        4        t

s                16               13              

1                         12       10              


2                                  9                20

3                4                         14      

4                         7                         4

t                                                  

Matriz de coste:

N1\N2    s        1        2        3        4        t

s                0                0               

1                         0        0               

2                                  0                0

3                0                         0       

4                         0                         0

El grafo dibujado tendría el siguiente aspecto.


Nótese que en los arcos se han representado los valores de mínimo, máximo y coste
respectivamente. Antes de iniciar el algoritmo se deben seleccionar un nodo origen
y un nodo destino, en este ejemplo se tomará el nodo s y el nodo t respectivamente.

Tras ejecutar el algoritmo se muestra la siguiente solución:


Flujos calculados desde el nodo origen (s) hasta el nodo destino (t)

Flujo máximo = 23

Matriz de Arcos con flujo máximo:

N1\N2    s        1        2        3        4        t       

s        0        12       0        11       0        0       

1        -12      0        12       0        0        0       

2        0        -12      0        0        -7       19      

3        -11      0        0        0        11       0       

4        0        0        7        -11      0        4       

t        0        0        -19      0        -4       0       

Matriz de Capacidades Residuales:

N1\N2    s        1        2        3        4        t       

s        0        4        0        2        0        0       

1        12       0        0        10       0        0       

2        0        12       0        9        7        1       


3        11       4        0        0        3        0       

4        0        0        0        11       0        0       

t        0        0        19       0        4        0

Como se puede observar, el flujo máximo es de 23 unidades. A continuación Grafos


subrayará los arcos de la solución, diferenciando el color ligeramente para
distinguir los arcos saturados de aquellos que tienen capacidad residual.

Si observa la figura verá cómo todo el flujo originario del nodo s se distribuye por
los arcos de la red, hasta llegar al nodo destino t. Nótese además, que en este
algoritmo no se han tenido en cuenta los costes asociados al transporte o flujo,
simplemente las conexiones y la restricción/capacidad de flujo de los arcos.
Grafos conexos
Un grafo es conexo si cada par de vértices está conectado por un camino; es decir,
si para cualquier par de vértices (a, b), existe al menos un camino posible
desde a hacia b.
Un grafo es doblemente conexo si cada par de vértices está conectado por al menos
dos caminos disjuntos; es decir, es conexo y no existe un vértice tal que al sacarlo el
grafo resultante sea disconexo.

Es posible determinar si un grafo es conexo usando un algoritmo Búsqueda en


anchura (BFS) o Búsqueda en profundidad (DFS).
En términos matemáticos la propiedad de un grafo de ser (fuertemente) conexo
permite establecer con base en él una relación de equivalencia para sus vértices, la
cual lleva a una partición de éstos en «componentes (fuertemente) conexas», es
decir, porciones del grafo, que son (fuertemente) conexas cuando se consideran
como grafos aislados. Esta propiedad es importante para muchas demostraciones
en teoría de grafos.

Aplicaciones
Gracias a la teoría de grafos se pueden resolver diversos problemas como por
ejemplo la síntesis de circuitos secuenciales, contadores o sistemas de apertura. Se
utiliza para diferentes áreas por ejemplo, Dibujo computacional,Redes, en toda las
áreas de Ingeniería.
http://es.wikipedia.org/wiki/Teor%C3%ADa_de_grafos#Grafos_conexos
Importancia
En conclusión podemos decir que el estudio de grafo es importante hoy en dia ya
que se aplica a muchas cosas en la vida cotidiana mas aun en la ingeniería en
sistemas como es la creación de circuitos, instalación de una red, etc. Es importante
dominar estos concepto y objetivos para una mejor aplicabilidad.

También podría gustarte