top of page

CODIGO C++

Lo siguiente es una implementación en c++ del algoritmo de Ford-Fulkerson. Para simplificar las cosas, el gráfico se representa como una matriz 2D.

// C++ program for implementation of Ford Fulkerson algorithm

#include <iostream>

#include <limits.h>

#include <string.h>

#include <queue>

using namespace std;

 

// Número de vértices en el gráfico dado

#define V 6

 

/* Devuelve true si hay un camino desde la fuente de 's' bajando a 't' en

gráfico residual. También se llena de los parent [] para almacenar el camino*/

bool bfs(int rGraph[V][V], int s, int t, int parent[])

{

       // Crear una matriz visitado y marcar todos los vértices como no visitados

       bool visited[V];

       memset(visited, 0, sizeof(visited));

 

       // Creación de una cola, vértice fuente encola y marcar vértices fuente

       // como visitado

       queue <int> q;

       q.push(s);

       visited[s] = true;

       parent[s] = -1;

 

       // Standard BFS Loop

       while (!q.empty())

       {

             int u = q.front();

             q.pop();

 

             for (int v=0; v<V; v++)

             {

                    if (visited[v]==false && rGraph[u][v] > 0)

                    {

                           q.push(v);

                           parent[v] = u;

                           visited[v] = true;

                    }

             }

       }

 

       //Si llegamos a caer en BFS a partir de la fuente, y luego volver

       // true, else false

       return (visited[t] == true);

}

 

// Retorna el maximo flujo de  s a t en el grafico dado

int fordFulkerson(int graph[V][V], int s, int t)

{

       int u, v;

 

       // Crear un gráfico residual y llenar la gráfica residual con

       //capacidades que figuran en el gráfico original como las capacidades residuales

       //En el gráfico residual

       int rGraph[V][V]; // Gráfica residual donde rGraph [i] [j]

       //indica la capacidad residual de borde de i a j (si hay un borde.

       //Si rGraph [i] [j] es 0, entonces todavía no hay)

       for (u = 0; u < V; u++)

             for (v = 0; v < V; v++)

                    rGraph[u][v] = graph[u][v];

 

       int parent[V]; // Esta matriz es llenada por BFS y ruta almacenada

 

       int max_flow = 0; // No hay flujo inicialmente

 

       // Aumentar el flujo mientras que hay camino desde la fuente al sumidero

       while (bfs(rGraph, s, t, parent))

       {

             // Encuentra capacidad residual mínima de los bordes a lo largo del camino

             // llenado por BFS. O podemos decir encontrar el flujo máximo

             // a través de la ruta encontrada.

             int path_flow = INT_MAX;

             for (v=t; v!=s; v=parent[v])

             {

                    u = parent[v];

                    path_flow = min(path_flow, rGraph[u][v]);

             }

 

// Actualizar las capacidades residuales de las aristas y las aristas a lo largo de la trayectoria inversa

             for (v=t; v != s; v=parent[v])

             {

                    u = parent[v];

                    rGraph[u][v] -= path_flow;

                    rGraph[v][u] += path_flow;

             }

 

             // Add path flow to overall flow

             max_flow += path_flow;

       }

 

       // Devuelve el flujo total

       return max_flow;

}

 

// Programa  Conductor para probar funciones anteriores

int main()

{

       // Vamos a crear un gráfico que se muestra en el ejemplo anterior

       int graph[V][V] = { {0, 16, 13, 0, 0, 0}, //c01c02

                           {0, 0, 10, 12, 0, 0}, //c12c13

                           {0, 4, 0, 0, 14, 0}, //c21c24

                           {0, 0, 9, 0, 0, 20}, //c32c35

                           {0, 0, 0, 7, 0, 4}, //c43c45

                           {0, 0, 0, 0, 0, 0}

                                  };

 

       cout << "El flujo máximo posible es: " << fordFulkerson(graph, 0, 5)<<"\n";

 

       return 0;

}

  1. Rojas Velasquez Alex Fernando

  2. Orbegoso Jumo Luis Angel

  3. Hinojosa del Aguila José Andres

PEstructuras y Algoritmos de Procesamiento de Datos II

ING. SOFTWARE

Lima-Perú © 2015.

arojasvel@gmail.com

  • Wix Facebook page
  • Wix Twitter page
  • Wix Google+ page
bottom of page