c: Ford - Fulkerson Algorithm

发布时间 2023-09-26 16:46:47作者: ®Geovin Du Dream Park™

 

FordFulkersonAlgorithm.h
 
/**
 * *****************************************************************************
 * @file        FordFulkersonAlgorithm.h
 * @brief       Ford - Fulkerson Algorithm in C Ford-Fulkerson算法(FFA)是一种 贪婪算法 ,用于计算流网络中的最大流量
 * IDE VSCODE C11
 * @author       (geovindu,Geovin Du,涂聚文)
 * @date        2023-09-26
 * @copyright   geovindu
 * *****************************************************************************
 */
#ifndef FORDFULKERSONALGORITHM_H
#define FORDFULKERSONALGORITHM_H



 
#include <stdio.h>
#include <stdlib.h>

#define A 0
#define B 1
#define C 2
#define MAX_NODES 10
#define O 1000000000



int flow[MAX_NODES][MAX_NODES];
int color[MAX_NODES];
int pred[MAX_NODES];

int head, tail;
int q[MAX_NODES + 2];

/**
 * @brief       
 * 
 * @param       x 
 * @param       y 
 * @return      int 
 */
int min(int x, int y);

/**
 * @brief       
 * 
 * @param       x 
 * @param       color 
 */
void enqueue(int x,int color[MAX_NODES]);

/**
 * @brief       
 * 
 * @param       color 
 * @return      int 
 */
int dequeue(int color[MAX_NODES]);

/**
 * @brief       
 * 
 * @param       start 
 * @param       target 
 * @param       color 
 * @param       pred 
 * @param       flow 
 * @param       capacity 
 * @return      int 
 */
int bfs(int start, int target,int color[MAX_NODES],int pred[MAX_NODES],int flow[MAX_NODES][MAX_NODES],int capacity[MAX_NODES][MAX_NODES]);


/**
 * @brief       
 * 
 * @param       source 
 * @param       sink 
 * @param       capacity 
 * @return      int 
 */
int FordFulkerson(int source, int sink,int capacity[MAX_NODES][MAX_NODES]);




#endif 

  

FordFulkersonAlgorithm.c
/**
 * *****************************************************************************
 * @file        FordFulkersonAlgorithm.c
 * @brief       Ford - Fulkerson Algorithm in C Ford-Fulkerson算法(FFA)是一种 贪婪算法 ,用于计算流网络中的最大流量
 * IDE VSCODE C11
 * @author       (geovindu,Geovin Du,涂聚文)
 * @date        2023-09-26
 * @copyright   geovindu
 * *****************************************************************************
 */

#include <stdio.h>
#include "include/FordFulkersonAlgorithm.h"



int fn=6;
int fe=7;
/**
 * @brief       
 * 
 * @param       x 
 * @param       y 
 * @return      int 
 */
int min(int x, int y) {
  return x < y ? x : y;
}



/**
 * @brief       
 * 
 * @param       x 
 * @param       color 
 */
void enqueue(int x,int color[MAX_NODES]) {
  q[tail] = x;
  tail++;
  color[x] = B;
}
/**
 * @brief       
 * 
 * @param       color 
 * @return      int 
 */
int dequeue(int color[MAX_NODES]) {
  int x = q[head];
  head++;
  color[x] = C;
  return x;
}

// Using BFS as a searching algorithm
/**
 * @brief       
 * 
 * @param       start 
 * @param       target 
 * @param       color 
 * @param       pred 
 * @param       flow 
 * @param       capacity 
 * @return      int 
 */
int bfs(int start, int target,int color[MAX_NODES],int pred[MAX_NODES],int flow[MAX_NODES][MAX_NODES],int capacity[MAX_NODES][MAX_NODES]) {
  int u, v;
  for (u = 0; u < fn; u++) {
    color[u] = A;
  }
  head = tail = 0;
  enqueue(start,color);
  pred[start] = -1;
  while (head != tail) {
    u = dequeue(color);
    for (v = 0; v < fn; v++) {
      if (color[v] == A && capacity[u][v] - flow[u][v] > 0) {
        enqueue(v,color);
        pred[v] = u;
      }
    }
  }
  return color[target] == C;
}

// Applying fordfulkerson algorithm
/**
 * @brief       
 * 
 * @param       source 
 * @param       sink 
 * @param       capacity 
 * @return      int 
 */
int FordFulkerson(int source, int sink,int capacity[MAX_NODES][MAX_NODES]) {
  int i, j, u;
  int max_flow = 0;
  for (i = 0; i < fn; i++) {
    for (j = 0; j < fn; j++) {
      flow[i][j] = 0;
    }
  }

  // Updating the residual values of edges
  while (bfs(source, sink,color,pred,flow,capacity)) {
    int increment = O;
    for (u = fn - 1; pred[u] >= 0; u = pred[u]) {
      increment = min(increment, capacity[pred[u]][u] - flow[pred[u]][u]);
    }
    for (u = fn - 1; pred[u] >= 0; u = pred[u]) {
      flow[pred[u]][u] += increment;
      flow[u][pred[u]] -= increment;
    }
    // Adding the path flows
    max_flow += increment;
  }
  return max_flow;
}

  

调用:

   //14 Ford - Fulkerson algorith 
    /**/

    printf("\n14 Ford - Fulkerson algorith \n");

    int capacity[10][10];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
        capacity[i][j] = 0;
        }
    }
    capacity[0][1] = 8;
    capacity[0][4] = 3;
    capacity[1][2] = 9;
    capacity[2][4] = 7;
    capacity[2][5] = 2;
    capacity[3][5] = 5;
    capacity[4][2] = 7;
    capacity[4][3] = 4;

    int s = 0, t =5;
    printf("\nMax Flow: %d\n", FordFulkerson(s, t,capacity));