Sunteți pe pagina 1din 42

Algoritmo de red de

flujo
Algoritmo de flujo mximo Algoritmo de Ford Fulkerson
Algoritmo del Flujo Mximo
1. Definicion:

Nodo destino
o sumidero
Nodo origen o
fuente
Algoritmo del Flujo Mximo
1. Definicion: Nodos (nodo intermediario)

Arcos o aristas

Nodo destino
o sumidero
Nodo origen o
fuente
Algoritmo del Flujo Mximo
1. Definicion: Nodos (nodo intermediario)

Arcos o aristas

Nodo destino
o sumidero
Nodo origen o
fuente

Flujo :
2. Definiciones Basicas:

Flujo Capacidad de flujo

Origen o Fuente de
flujo

Destino o Sumidero Capacidad residual


de flujo
0 4 20

10

1 30 0
20 0 5

30 0 10
0
2 3 20
40 0
0 4 20

5
Nodo
origen 10 Nodo
destino
1 30 0
20 0 5

30 0 10
0
2 3 20
40 0
0 4 20

5
Nodo
origen 10 Nodo
destino
1 30 0
20 0 5

Flujo
30 0 10
0
2 3 20
40 0
0 4 20

5
Nodo
origen 10 Nodo
destino
1 30 0
20 0 5

Flujo
30 0 10
0
2 3 20
40 0
Capacidad
de flujo
3. Aplicaciones:

Sistema de vias publicas

Distribucion del sistema


electrico venezolano
Algoritmo Ford-Fulkerson
Historia:
En 1962, L. R. Ford y D. R. Fulkerson desarrollaron una tcnica efectiva para resolver problemas de flujo
mximo. Es un mtodo genrico para aumentar la capacidad de los flujos incrementalmente a lo largo de
los caminos que van del origen al destino, que sirve como la base para un familia de algoritmos. Esta
tcnica es conocida como el mtodo Ford-Fulkerson en la literatura clsica, aunque tambin puede
encontrarse como el aumenting-path method.
Descripcin:
El algoritmo de Ford-Fulkerson propone buscar caminos en los que se pueda aumentar el flujo, hasta que se
alcance el flujo mximo.
La idea es encontrar unaruta de penetracincon un flujo positivo neto que una los nodos origen y destino.
El flujo es siempre positivo y con unidades enteras.
El flujo a travs de un arco es menor o igual que la capacidad.

El flujo que entra en un nodo es igual al que sale de l.


0 4 20

10

1 30 0
20 0 5

30 0 10
0
2 3 20
40 0
0 4 20

10

1 30
0
[,-]
20 0 5

30 0 10
0
2 3 20
40 0
[30,1]
0 4 20

10

1 30
0
[,-]
20 0 5
[20,3]
0

30 0 10
0
2 3 20
40 0
[30,1]
C: capacidad 1era interaccion:
i,j : indice de los nodos k=min{,30,20}= 20
k; menor flujo traspasado del C 13,31 -> (30-20, 0+20) -> (10,20)
0 4 20 C 35,53 -> (20-20, 0+20) -> (0,20)
nodo origen al destino
C ij,ji -> (Cijk, Cji+k)
5

10

1 30
0
[,-]
20 0 5
[20,3]
0

30 0 10
0
2 3 20
40 0
[30,1]
C: capacidad 1era interaccion:
i,j : indice de los nodos k=min{,30,20}= 20
k; menor flujo traspasado del C 13,31 -> (30-20, 0+20) -> (10,20)
0 4 20 C 35,53 -> (20-20, 0+20) -> (0,20)
nodo origen al destino
C ij,ji -> (Cijk, Cji+k)
5

10

1 10
0
[,-]
20 0 5
[20,3]
20

30 20 10
0
2 3 0
40 0
[30,1]
0 4 20

10

1 10
0
[,-]
20 0 5

20

30 10
0 20
2 3 0
40 0
0 4 20

10

1 10
0
[,-]
20 0 5

20

30 10
0 20
2 3 0
40 0
[20,1]
0 4 20

10

1 10
0
[,-]
20 0 5

20

30 10
20
0
2 3 0
40 0
[20,1] [40,2]
[10,3]

0 4 20

10

1 10
0
[,-]
20 0 5

20

30 10
20
0
2 3 0
40 0
[20,1] [40,2]
[10,3]

0 4 20

10

1 10 [20,4]
0
[,-]
20 0 5

20

30 10
20
0
2 3 0
40 0
[20,1] [40,2]
2da interaccion:
[10,3] k=min{,20,40,10,20}= 10
C 12,21 -> (20-10,0+10) -> (10,10)
0 4 20 C 23,32 -> (40-10,0+10) -> (30,10)
C 34,43 -> (10-10,5+10) -> (10,15)
5 C 45,54 -> (20-10,0+10) -> (10,10)

10

1 10 [20,4]
0
[,-]
20 0 5

20

30 10
20
0
2 3 0
40 0
[20,1] [40,2]
2da interaccion:
[10,3] k=min{,20,40,10,20}= 10
C 12,21 -> (20-10,0+10) -> (10,10)
0 4 10 C 23,32 -> (40-10,0+10) -> (30,10)
C 34,43 -> (10-10,5+10) -> (0,15)
15 C 45,54 -> (20-10,0+10) -> (10,10)

10

1 10 [20,4]
10
[,-]
10 0 5

20

30 0
20
10
2 3 0
30 10
[20,1] [40,2]
0 4 10

15

10

1 10
10
[,-]
10 0 5

20

30 0
20
10
2 3 0
30 10
[10,1]
0 4 10

15

10

1 10 [30,2]
10
[,-]
10 0 5

20

30 0
20
10
2 3 0
30 10
[10,1]
3ra interaccion:
k=min{,10,30}= 10
4 C 12,21 -> (10-10,10+10) -> (0,20)
0 10 C 25,52 -> (30-10,0+10) -> (20,10)
15

10

1 10 [30,2]
10
[,-]
10 0 5

20

30 0
20
10
2 3 0
30 10
[10,1]
0 4 10

15

10

1 10 [30,2]
10
[,-]
0 10 5

20

20 0
20
20
2 3 0
30 10
[10,1]
0 4 10

15

10

1 10
10
[,-]
0 10 5

20

20 0
20
20
2 3 0
30 10
[10,1]
0 4 10

15

10

1 10
10
[,-]
0 10 5

20

20 0
20
20
2 3 0
30 10
[10,3] [10,1]
0 4 10

15

10

1 10 [20,2]
10
[,-]
0 10 5

20

20 0
20
20
2 3 0
30 10
[10,3] [10,1]
4ta interaccion:
k=min{,10,10,20}= 10
4 C 13,31 -> (10-10,20+10) -> (0,30)
0 10 C 32,23 -> (10-10,30+10) -> (0,40)
C 25,52 -> (20-10,10+10) -> (10,20)
15

10

1 10 [20,2]
10
[,-]
0 10 5

20

20 0
20
20
2 3 0
30 10
[10,3] [10,1]
0 4 10

15

10

1 0 [20,2]
10
[,-]
0 20 5

20

10 0
30
20
2 3 0
40 0
[10,3] [10,1]
[10,1]

0 4 10

15

10

1 0
10
[,-]
0 20 5

20

10 0
30
20
2 3 0
40 0
[10,1]

0 4 10

15

10

1 0 [10,4]
10
[,-]
0 20 5

20

10 0
30
20
2 3 0
40 0
[10,1] 5ta interaccion:
k=min{,10,10}= 10
4 C 14,41 -> (10-10,0+10) -> (0,10)
0 10 C 45,54 -> (10-10,10+10) -> (0,20)
15

10

1 0 [10,4]
10
[,-]
0 20 5

20

10 0
30
20
2 3 0
40 0
[10,1]

10 4 0

15

1 0 [10,4]
20
[,-]
0 20 5

20

10 0
30
20
2 3 0
40 0
[10,1] 6ta interaccion:
No hay flujo disponible debido a
4 que todos los arcos fuera del nodo
10 0 1 tienen capacidad residual igual
a 0.
15

1 0 [10,4]
20
[,-]
0 20 5

20

10 0
30
20
2 3 0
40 0
El flujo maximo en la red es F= k1+k2+k3+k4+k5
Hallamos:
k1=20
k2=10
k3=10
k4=10
k5=10
Entonces -> F= 60
Interpretacion:
La sumatoria de todos los ki (menores flujos) es 60 unidades, que es el flujo maximo que
podemos pasar desde el nod origen hasta el nodo destino a traves de la red de nodos
Pseudocdigo:
#include <iostream>
#include <string.h>
En C++ : #include <queue>
#include <conio.h>
#include <climits>
using namespace std;
bool bfs(int rGraph[][5], int s, int t, int padre[])
{
bool visito[5];
memset(visito, 0, sizeof(visito));
queue <int> q;
q.push(s);
visito[s] = true;
padre[s] = -1;

while (!q.empty())
{
int u = q.front();
q.pop();
for (int v = 0; v < 5; v++)
{
if (visito[v] == false && rGraph[u][v] > 0)
{
q.push(v);
padre[v] = u;
visito[v] = true;
}
}
}
return (visito[t] == true);
}
int fordFulkerson(int grafo[5][5], int s, int t)
{
int u, v;
int rGraph[5][5];
for (u = 0; u < 5; u++){
for (v = 0; v < 5; v++)
{
rGraph[u][v] = grafo[u][v];
}
}
int padre[5];
int flujo_maximo = 0;
while (bfs(rGraph, s, t, padre))
{
int trayectoria = INT_MAX;
for (v = t; v != s; v = padre[v])
{
u = padre[v];
trayectoria = min(trayectoria, rGraph[u][v]);
}
for (v = t; v != s; v = padre[v])
{
u = padre[v];
rGraph[u][v] -= trayectoria;
rGraph[v][u] += trayectoria;
}
flujo_maximo += trayectoria;
}
return flujo_maximo;
}
int main()
{
int grafo[5][5] = { {0, 20, 30, 10, 0},
{0, 0, 40, 0, 30},
{0, 0, 0, 10, 20},
{0, 0, 5, 0, 20},
{0, 0, 0, 0, 0},
};
cout << "El maximo flujo es... " << fordFulkerson(grafo, 0,4);
getch();
}
//Output El mximo flujo es 60

S-ar putea să vă placă și