Maximum Flow

Supported Graph Characteristics

Weighted edges

Homogeneous vertex types

Heterogeneous vertex types

Algorithm link: Maximum Flow

Flow is the concept of something moving from one vertex to another in a graph, such as money (in a financial graph), data (in a computer network), or even water (in a utility network).

A graph must have weighted edges to represent flow.

The maximum flow problem is to find the maximum possible flow from a source vertex to the target vertex.

Assuming a weighted graph where every edge has a capacity under the following constraints:

  • Flow on an edge doesn’t exceed the capacity of the edge.

  • Incoming flow is equal to outgoing flow for every vertex except s and t.

TigerGraph’s implementation of the Maximum Flow algorithm is based on a modified version of the Edmond-Karp algorithm.

Use cases

The Maximum Flow algorithm has real world applications such as airline scheduling, and in solving circulation-demand problems.

Specifications

CREATE QUERY tg_maxflow(VERTEX source, VERTEX sink,  SET<STRING> v_type_set,
   SET<STRING> e_type_set, SET<STRING> reverse_e_type_set, STRING cap_attr,
  STRING cap_type, FLOAT min_flow_threshhold = 0.001, BOOL print_results = TRUE, BOOL display_edges = TRUE, BOOL spit_to_file = FALSE, STRING file_path = "/home/tigergraph/tg_query_output.csv")

Parameters

Parameter Description

VERTEX source

Source vertex where the flow starts. Provide the vertex ID and type as a tuple: ("id","type")

VERTEX sink

Target vertex where the flow is to be sent to. Provide the vertex ID and type as a tuple: ("id","type")

SET<STRING> v_type_set

Vertex types to consider in the path.

SET<STRING> e_type_set

Edge types to traverse.

SET<STRING> reverse_e_type_set

Reverse edge types to traverse.

STRING cap_attr

Name of the attribute that contains the capacity of the edge.

STRING cap_type

Data type of the cap_attr attribute.

FLOAT min_flow_threshold

Minimum flow for an edge to carry if it is to carry any flow.

BOOL print_results

If true, output JSON to standard output.

BOOL display_edges

If true, the resulting path includes edges in addition to vertices.

BOOL split_to_file

If true, the file output will contain every edge and how much flow they would carry to achieve the maximum flow.

STRING file_path

If not empty, write output to this file.

Output

JSON result

The return value is the maximum flow that can be carried from the source to the sink. If you set display_edges to true, the result will contain all edges that carry flow. However, it does not output how much flow each edge carries to achieve the maximum flow.

CSV result

The first line is the maximum flow that can be carried from the source to the sink. If you set split_to_file to true, the result will contain all edges that carry flow as well as how much flow they carry to achieve maximum flow.

Time complexity

The time complexity of the Edmond-Karp algorithm is independent of maximum flow in the graph. Here, the time complexity is \(O(VE^2)\) where \(V\) is the number of vertices and \(E\) is the number of edges in the graph.

Example

Suppose we have the following four areas a, b, c and d in a city. Between each area is a pipeline that can be used to deliver water.

max flow

If a is the source and d is the target (the sink), the maximum flow from a to d in this network is 51. With the edge from a to d carrying 35, and the remaining edges each carrying 8.

If we run the max flow algorithm on this network, we will get the result that the maximum flow is from a to d is 51:

Query
RUN QUERY tg_maxflow (("a", "area"), ("d", "area"), ["area"], ["pipeline"], ["reverse_pipeline"], "capacity", "FLOAT", _, _, _, TRUE, _)
  • JSON

  • CSV

{
  "error": false,
  "message": "",
  "version": {
    "schema": 1,
    "edition": "enterprise",
    "api": "v2"
  },
  "results": [
    {"@@sum_max_flow": 51},
    {"@@edges_set": [
      {
        "from_type": "area",
        "to_type": "area",
        "directed": true,
        "from_id": "b",
        "to_id": "d",
        "attributes": {"capacity": 8},
        "e_type": "pipeline"
      },
      {
        "from_type": "area",
        "to_type": "area",
        "directed": true,
        "from_id": "c",
        "to_id": "d",
        "attributes": {"capacity": 8},
        "e_type": "pipeline"
      },
      {
        "from_type": "area",
        "to_type": "area",
        "directed": true,
        "from_id": "a",
        "to_id": "c",
        "attributes": {"capacity": 20},
        "e_type": "pipeline"
      },
      {
        "from_type": "area",
        "to_type": "area",
        "directed": true,
        "from_id": "a",
        "to_id": "d",
        "attributes": {"capacity": 35},
        "e_type": "pipeline"
      },
      {
        "from_type": "area",
        "to_type": "area",
        "directed": true,
        "from_id": "a",
        "to_id": "b",
        "attributes": {"capacity": 34},
        "e_type": "pipeline"
      }
    ]}
  ]
}
Maxflow: 51
From,To,Flow
a,c,8
c,d,8
a,b,8
b,d,8
a,d,35