Documente Academic
Documente Profesional
Documente Cultură
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:
Origen o Fuente de
flujo
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:
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