C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

Network_Flow問題を実装するためのC++プログラム


これは、FordFulkersonアルゴリズムを使用してNetwork_Flow問題を実装するためのC++プログラムです。

アルゴリズム:

Begin
   function bfs() returns true if there is path from source s to sink t in
   the residual graph which indicates additional possible flow in the graph.
End
Begin
   function fordfulkarson() return maximum flow in given graph:
   A) initiate flow as 0.
   B) If there is an augmenting path from source to sink, add the path to flow.
   C) Return flow.
End

サンプルコード

#include <iostream>
#include <climits>
#include <cstring>
#include <queue>
#define n 7
using namespace std;
bool bfs(int g[n][n], int s, int t, int par[])
{
   bool visit[n];
   memset(visit, 0, sizeof(visit));
   queue <int> q;
   q.push(s);
   visit[s] = true;
   par[s] = -1;
   while (!q.empty())
   {
      int u = q.front();
      q.pop();
      for (int v=0; v<n; v++)
      {
         if (visit[v]==false && g[u][v] > 0)
         {
            q.push(v);
            par[v] = u;
            visit[v] = true;
         }
      }
   }
   return (visit[t] == true);
}
int fordFulkerson(int G[n][n], int s, int t)
{
   int u, v;
   int g[n][n];
   for (u = 0; u < n; u++)
   {
      for (v = 0; v < n; v++)
      g[u][v] = G[u][v];
   }
   int par[n];
   int max_flow = 0;
   while (bfs(g, s, t,par))
   {
      int path_flow = INT_MAX;
      for (v=t; v!=s; v=par[v])
      {
         u = par[v];
         path_flow = min(path_flow, g[u][v]);
      }
      for (v = t; v != s; v = par[v])
      {
         u = par[v];      
         g[u][v] -= path_flow;
         g[v][u] += path_flow;
      }
      max_flow += path_flow;
   }
   return max_flow;
}
int main()
{
   int g[n][n] = {{0, 6, 7, 1},
      {0, 0, 4, 2},
      {0, 5, 0, 0},
      {0, 0, 19, 12},
      {0, 0, 0, 17},
      {0, 0, 0, 0}};
   cout << "The maximum possible flow is " << fordFulkerson(g, 0, 3);
   return 0;
}

出力

The maximum possible flow is 3

  1. バブルソートを実装するC++プログラム

    バブルソートは、比較ベースのソートアルゴリズムです。このアルゴリズムでは、隣接する要素が比較および交換されて、正しいシーケンスが作成されます。このアルゴリズムは他のアルゴリズムよりも単純ですが、いくつかの欠点もあります。このアルゴリズムは、多数のデータセットには適していません。並べ替えタスクの解決には時間がかかります。 バブルソート手法の複雑さ 時間計算量:最良の場合はO(n)、O(n 2 )平均および最悪の場合 スペースの複雑さ:O(1) Input − A list of unsorted data: 56 98 78 12 30 51 Output &mi

  2. 基数ソートを実装するC++プログラム

    基数ソートは、非比較ソートアルゴリズムです。この並べ替えアルゴリズムは、同じ位置と値を共有する数字をグループ化することにより、整数キーで機能します。基数は、記数法のベースです。 10進法では、基数または基数は10であることがわかっているので、いくつかの10進数を並べ替えるには、数値を格納するために10個の位取りボックスが必要です。 基数ソート手法の複雑さ 時間計算量:O(nk) スペースの複雑さ:O(n + k) Input − The unsorted list: 802 630 20 745 52 300 612 932 78 187 Output &minus