Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Facultad de Ingeniería
Postgrado en Computación
Andrés Arcia
Caminos Cortos en Todos los
Pares de Arcos
• Dado un grafo dirigido G=(V,E) con una
función de peso w:E→R. Se desea
encontrar todos los caminos más cortos
(de menor peso) entre todos los pares
(u,v) ∈ V.
¿Cómo resolver el problema?
En una primera instancia utilizando algún algoritmo de caminos
cortos desde un solo vértice, |V| veces, una vez para cada
vértice.
0 si i=j
wij peso de (i,j) si i≠j y (i,j) ∈ E
∞ si i≠j y (i,j) ∉ E
Salida
• Una matriz D=(dij ) con las distancias mínimas
entre el par (i,j).
• Una matriz Π =(π ij ), donde π ij =NULL si i=j ó no
hay camino de i a j, de otra forma contiene al
predecesor de j en el camino mínimo.
si i=j p⇒0
si i≠j p⇒i ~p’> k→j tiene m-1 nodos
δ (i,j) = δ (i,k) + w(k,j)
Solución Recursiva
• Sea dij (m) el peso mínimo para algún camino
de i a j con m arcos:
si m=0 ⇒ no hay arcos
dij (0) = 0 si i=j
∞ si i≠j
Si m≥ 1 ⇒ dij (m) = min (1≤ k≤ n, dik (m-1) + wkj )
• ¿Cuál es el límite de m?
δ (i,j) = dij (n-1) =dij (n) =dij (n+1) =…
Cálculo de la Solución de
Abajo hacia Arriba
• Entrada:
W=(wij), luego se calcula una serie de
matrices D(1), D(2), …, D(n-1) | D(m)=(dij(m)).
D(n-1) contiene los caminos más cortos.
Cálculo de la Solución de
Abajo hacia Arriba
• En esencia el siguiente algoritmo extiende la solución
del camino más corto, un arco a la vez.
EXTEND-SHORTEST-PATHS (D,W)
1 n ← rows[D]
2 let D’=(d’ij) be a nxn matrix.
3 for i ← 1 to n
4 do for j ← 1 to n
5 do d’ij ← ∞
6 for k ← 1 to n
7 do d’ij = min(d’ij, dik + wkj)
8 return D’
Este algoritmo es O(n3). Observe los tres for anidados.
Relación con la
Multiplicación de Matrices.
• Suponga C=A.B; donde A,B y C son matrices nxn.
La multiplicación de matrices se define:
cij = Σ (k=1, n, aik.bkj) → dij(m)=min(1≤ k≤ n, dik(m-1) + wkj)
d(m-1)→a
w→b
d(m)→c
min→+
+ →.
Algoritmo
Sea AB un producto matricial retornado por EXTEND-SHORTEST-
PATHS(A,B)
D(1) = D(0) .W = W
D(2) = D(1) .W = W2
D(3) = D(2) .W = W3
…
D(n-1) = D(n-2) .W = Wn-1
SLOW-ALL-PAIRS-SHORTEST-PATHS(W)
1 n ← rows[w]
2 D(1) ← W
3 for m ←2 to n-1
4 do D(m) ← EXTEND-SHORTEST-PATHS(D(m-1) ,w)
5 return D(n-1)
⇒O(n4)
Mejora del Tiempo de Ejecución
¿Cuál es el objetivo? R: D(n-1)
Recordemos que si no hay ciclos negativos, D(m)=D(n-1) ∀ m
≥ n-1
Así, podemos computar D(n-1) en solo lg(n-1), haciendo
D(1) = W
D(2) = W2 = W.W
D(4) = W4 = W2. W2
D(8) = W8 = W4. W4
…
D(2^ln(n-1)) = W(2^ ln(n-1) ) = W(2^( ln(n-1) -1)) . W(2^( ln(n-1) -1))
Wij si k=0
dij(k) = min(dij (k-1) , dik (k-1) + dkj (k-1) ) si k≥ 1
Computo de Abajo hacia Arriba
FLOYD-WARSHALL(W)
1 n←rows[n]
2 D(0) ← w
3 for k ← 1 to n
4 do for i ←1 to n
5 do for j ←1 to n
6 dij(k) ←min(dij(k-1), dik(k-1)+ dkj(k-1))
7 return D(n)
⇒Θ (n3)
Valores iniciales
Ejemplo
0 3 8 ∞ -4 NIL 1 1 NIL 1
∞ 0 ∞ 1 7 NIL NIL NIL 2 2
D(0) = ∞ 4 0 ∞ ∞ ∏ (0) = NIL 3 NIL NIL NIL
2 ∞ -5 0 ∞ 4 NIL 4 NIL NIL
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL
∞ NIL 1 1 NIL 1
0 3 8 -4
∞ 0 ∞ 1 7 NIL NIL NIL 2 2
0 3 8 4 -4 NIL 1 1 2 1
∞ 0 ∞ 1 7 NIL NIL NIL 2 2
π (k-1)
si dij (k-1) ≤ dik (k-1) + dkj (k-1)
π ij
(k) ij
π kj
(k-1)
si dij (k-1) > dik (k-1) + dkj (k-1)
Clausura transitiva de un grafo
dirigido
Dado un grafo dirigido G=(V,E) con un
conjunto de nodos V = {1,2,…,n} se quiere
averiguar si hay un camino de i a j ∀ i,j ∈
V.
ϖ se determina en O(VE).
Reasignación de Pesos
Lema:
La reasignación de pesos no cambia los caminos
más cortos.
Sea G=(V,F) con w:E→R y h:V→R cualquier
función que mapea V→R. Luego ∀(u,v)∈E:
ϖ(u,v) = w(u,v) + h(u) – h(v).
Sea p = <v0, v1, … vk> un camino de v0 a vk.
w(p)=δ (v0,vk) ⇔ ϖ (p)=δ (v0,vk)
G tiene ciclo negativo ⇔ G´ tiene ciclo negativo
Reasignación de Pesos
Prueba:
ϖ(p) = w(p) + h(v0) – h(vk)
Se tiene
ϖ (p) = Σ (i=1, k, ϖ (vi-1 , vi))
= Σ (i=1, k, w(vi-1 , vi) + h(vi-1 ) - h(vi))
= Σ (i=1, k, w(vi-1 , vi)) + h(v0) – h(vk)
= w(p) + h(v0) – h(vk)
Suponga que hay un camino más corto p’ desde v0 a vk usando ϖ . Entonces ϖ (p’)<
ϖ (p).
w(p’) + h(v0) – h(vk) = ϖ (p’)
< w(p)
= w(p)+h(v0)+h(vk)
Que implica que w(p’) < w(p) que contradice que p es el camino más corto.
Suponga que hay un ciclo negativo c = <v0, v1, …, vk>
Luego, ϖ (c)=w(c) + h(v0) – h(vk)
=w(c) ⇒ si hay ciclo negativo en ϖ (c) tambien lo hay en w(c).
Algoritmo
JHONSON
1 compute G’, V[G’]=V[G] U {s}, E[G’]=E[G]U{(s,v) : v ∈ V[G]}
2 if BELLMAN-FORD(G’,w,s) = false
3 then print “there is a negative weight cycle”
4 else for each vertex v ∈ V[G]
5 do set h(v) to the value computed by the BELLMAN-
FORD algorithm.
6 for each edge (u,v) ∈ E[G’]
7 do ϖ(u,v)←w(u,v) + h(u) – h(v)
8 for each vertex u ∈ V[G]
9 do run Dijkstra(G, ϖ , u) to compute δ ’(u,v) ∀ u ∈ V[G]
10 for each vertex v ∈ V[G]
11 do duv← δ ’(u,v) + h(v) – h(u)
12 return D
0
Ejemplo
-1
0 3 4
7 1
0 0 -5
0 8
5
-4 2
-5
0 -1
-4 0 0 4 0
6 10 0
0 0 -5
0 13
0 0 2
0
4
-4 0
2
0
Ejemplo
2/1 0/0
4 0 4 0
10 0 10 0
0/0 2/-3 2/3 0/-4
13 13
0 2 0 2
0 0
v1 v1 v1 v1 v1
8/10
8/10
5/10
10 10
3/4
2/4
4 4 4
v2 v2 v2 v2 v2
Redes de múltiples entradas y
múltiples salidas
s1
s2
t1
∞ ∞
∞
∞ s3 T’
S’
∞ ∞
∞ t2
s4
s5
Metodo Ford-Fulkerson
• El método iterativo depende de tres ideas
importantes:
– Red residual
– Aumento de camino
– Cortes
Para ello usaremos el teorema max-flow
min-cut que caracteriza el flujo máximo en
terminos de cortes de la red de flujo.
Iteración
• En cada iteración se va consiguiendo un valor
de flujo que aumenta el camino, es decir,
podemos aumentar el flujo en un camino de s a
t. Este proceso se repite hasta que no haya
más posibilidad de aumentar.
FORD-FULKERSON-METHOD(G,s,t)
1 initialize flow f to 0
2 while there exists an augmenting path p.
3 do augment flow f along p
4 return f.
Red Residual
La red residual consiste en arcos que admiten más flujo.
Dada una red de flujo G=(V,E) con fuente s y destino t. Sea
f el flujo en G, y considere un par de vertices u,v ∈V. La
cantidad de flujo adicional que se puede verter sobre u,v es
la capacidad residual.
cf(u,v) = c(u,v) – f(u,v)
Ejemplo:
c(u,v)=16, f(u,v)=-4 ⇒cf(u,v)=20
c(u,v)=16, f(u,v)=10 ⇒cf(u,v)=6
3 4 3 4 3 4
1
2 3 2 3
5 5 2
5 2
t t t
Cmin = 2 Cmin = 1 Cmin = 1
Ejemplo
Flujo Máximo
s
S
2 0
2
3 4
2
2 1
5
t
T
1 2
Análisis
• El algoritmo está acotado por O(|f*|) donde f* es el flujo máximo.
1.0 1.0
00
.000 00 . 999 .00
1.00
0
u
.00
0 999 u 0
s 1 1
s 1 t 1 t
1.0 1.0
0 0.0 0 0 .9 99
00 v 0. 00 0.0 v 999
1.00 00
99
9 .9
. 99 9 99
999 u
s 1 1 1 t
99
9.9
99 v .9 99
999
Mejora
• Si hallamos el camino mínimo de s a t en
la red residual donde cada arco tiene
peso 1, se puede mejorar Ford-Fulkerson.
Este método es llamado Edmonds-Karp y
esta acotado por O(VE).