Path–cycle decomposition of nonnegative arrow assignments #
Every nonnegative arrow assignment f on a finite arrow family is a finite sum of positively
weighted directed paths and directed cycles, with equality on every arrow. No conservation or
capacity condition is needed: each path runs from a vertex of negative excess of f (a supply
vertex) to a vertex of positive excess (a demand vertex), and its interior vertices are
unrestricted. The total weight of the paths leaving a supply vertex is minus its excess, the total
weight of the paths entering a demand vertex is its excess, and every component is bounded
arrowwise by f. A walk of weight q contributes n • q to an arrow it traverses n times, as
in TauCeti.walkAssignment, so the theory needs no multiplicative unit; paths and cycles traverse
each arrow at most once.
There is such a decomposition with at most as many components as arrows of positive value, and
with all weights in any additive subgroup containing the values of f. For an ordinary s–t
flow every path of a decomposition runs from s to t, and the path weights add up to the value
of the flow; for a circulation there are no paths at all.
Main definitions #
TauCeti.WeightedWalkandTauCeti.WeightedClosedWalk: directed walks and closed walks with a weight, and their assignments.TauCeti.PathCycleDecomposition f: a decomposition offinto positively weighted directed paths from supply to demand vertices and positively weighted directed cycles.TauCeti.PathCycleDecomposition.pathAssignmentandTauCeti.PathCycleDecomposition.cycleAssignment: the sums of the path and cycle components.
Main results #
TauCeti.exists_pathCycleDecomposition: every nonnegative assignment has a path–cycle decomposition with at most as many components as arrows of positive value, all of whose weights lie in any given additive subgroup containing the values of the assignment.TauCeti.PathCycleDecomposition.sum_weight_filter_source_eq_negPartandTauCeti.PathCycleDecomposition.sum_weight_filter_target_eq_posPart: the supply and demand identities.TauCeti.PathCycleDecomposition.assignment_le_of_mem_pathsandTauCeti.PathCycleDecomposition.assignment_le_of_mem_cycles: every component is bounded arrowwise by the decomposed assignment.TauCeti.PathCycleDecomposition.paths_eq_nil: a decomposition of a circulation consists of cycles only.TauCeti.PathCycleDecomposition.source_eq_of_mem_paths,TauCeti.PathCycleDecomposition.target_eq_of_mem_pathsandTauCeti.PathCycleDecomposition.sum_weight_paths_eq_val: the decomposition of an ordinarys–tflow, whose paths run fromstotwith total weight the value of the flow.TauCeti.PathCycleDecomposition.pathAssignment_apply_le_val: the path components of a decomposition of an ordinary flow carry at most its value on every arrow.TauCeti.PathCycleDecomposition.weight_eq_one_of_mem_pathsandTauCeti.PathCycleDecomposition.pairwise_disjoint_arrows: for an integer assignment carrying at most one unit on every arrow, every path component has weight one and different path components traverse no common arrow.TauCeti.Flow.exists_paths_card_eq_val: an integers–tflow carrying at most one unit on every arrow carries as many arrow-disjoints–tpaths as its value.TauCeti.Flow.exists_paths_card_eq_val_card_filter_le: an integers–tflow carries a family ofs–tpaths, repetitions allowed, with as many members as its value, such that every vertex other thanslies on at most as many members as the value entering it.
Implementation notes #
The decomposition is built by peeling off one weighted path or cycle at a time. If the arrows of positive value contain a directed cycle, that cycle is subtracted with its bottleneck as weight; otherwise a path of positive arrows from a vertex that no positive arrow enters to a vertex that no positive arrow leaves is subtracted with its bottleneck as weight. Each step makes the value of a positive arrow zero, which bounds the number of components, and each weight is a value of the current assignment, which keeps the weights in the subgroup.
References #
- L. R. Ford, D. R. Fulkerson, Flows in Networks, Princeton University Press, 1962.
- R. K. Ahuja, T. L. Magnanti, J. B. Orlin, Network Flows: Theory, Algorithms, and Applications, Prentice Hall, 1993, Section 3.5.
A directed walk along the arrow family Q, together with its endpoints and a weight.
- source : V
The first vertex of the walk.
- target : V
The last vertex of the walk.
The walk itself.
- weight : K
The weight of the walk.
Instances For
A closed directed walk along the arrow family Q, together with its base vertex and a
weight.
- base : V
The first and last vertex of the closed walk.
The closed walk itself.
- weight : K
The weight of the closed walk.
Instances For
The assignment of a weighted walk: its walk weighted by its weight.
Instances For
The assignment of a weighted closed walk: its walk weighted by its weight.
Instances For
The excess at v of a sum of weighted walks is the total weight of the walks ending at v
minus the total weight of the walks starting at v.
The total excess on a vertex set S of a sum of weighted walks is the total weight of the walks
ending in S minus the total weight of the walks starting in S.
The excess of a sum of weighted closed walks vanishes.
A path–cycle decomposition of the arrow assignment f: finite lists of positively weighted
directed paths and positively weighted directed cycles whose assignments add up to f, such that
every path starts at a vertex of negative excess of f and ends at a vertex of positive excess
of f.
- paths : List (WeightedWalk Q K)
The weighted paths.
- cycles : List (WeightedClosedWalk Q K)
The weighted cycles.
- isPath_walk (p : WeightedWalk Q K) : p ∈ self.paths → p.walk.IsPath
Every path component is a directed path.
- isCycle_walk (c : WeightedClosedWalk Q K) : c ∈ self.cycles → c.walk.IsCycle
Every cycle component is a directed cycle.
- weight_pos_of_mem_paths (p : WeightedWalk Q K) : p ∈ self.paths → 0 < p.weight
Every path component has positive weight.
- weight_pos_of_mem_cycles (c : WeightedClosedWalk Q K) : c ∈ self.cycles → 0 < c.weight
Every cycle component has positive weight.
Every path starts at a vertex of negative excess.
Every path ends at a vertex of positive excess.
- sum_paths_add_sum_cycles : (List.map WeightedWalk.assignment self.paths).sum + (List.map WeightedClosedWalk.assignment self.cycles).sum = f
The components add up to the decomposed assignment.
Instances For
The sum of the path components of a decomposition.
Instances For
The sum of the cycle components of a decomposition.
Instances For
The cycle components form a circulation.
The path components have the same excess as the decomposed assignment.
The excess of the decomposed assignment at v is the total weight of the paths ending at v
minus the total weight of the paths starting at v.
No path of a decomposition starts at a vertex of nonnegative excess.
No path of a decomposition ends at a vertex of nonpositive excess.
A path component of a decomposition places its weight on each of its arrows.
A decomposition of a circulation has no path components.
A path component of a decomposition is nonnegative.
An assignment with a path–cycle decomposition is nonnegative.
Every path component is bounded arrowwise by the decomposed assignment.
Every cycle component is bounded arrowwise by the decomposed assignment.
Every arrow of a cycle component has positive value in the decomposed assignment.
A decomposition has no components exactly when it decomposes the zero assignment.
Decompositions of ordinary flows #
Every path of a decomposition of an ordinary s–t flow starts at s.
Every path of a decomposition of an ordinary s–t flow ends at t.
The path weights of a decomposition of an ordinary s–t flow add up to its value.
The path components of a decomposition of an ordinary s–t flow carry at most the value of
the flow on every arrow.
Supply identity. The total weight of the paths starting at v is the negative part of the
excess at v: minus the excess at a supply vertex, and zero elsewhere.
Demand identity. The total weight of the paths ending at v is the positive part of the
excess at v: the excess at a demand vertex, and zero elsewhere.
Existence #
Path–cycle decomposition. Every nonnegative arrow assignment f on a finite arrow family
is a sum of positively weighted directed paths, each from a vertex of negative excess to a vertex
of positive excess, and positively weighted directed cycles. The number of components is at most
the number of arrows on which f is positive, and if the values of f lie in an additive subgroup
H, then so do all weights.
Every nonnegative arrow assignment on a finite arrow family has a path–cycle decomposition.
Decompositions of assignments carrying at most one unit on every arrow #
Every path component of a decomposition of an integer assignment carrying at most one unit on every arrow has weight one.
In a decomposition of an integer assignment carrying at most one unit on every arrow, every arrow traversed by a path component carries exactly one unit.
In a decomposition of an integer assignment carrying at most one unit on every arrow, no two different path components traverse a common arrow.
An integer s–t flow carrying at most one unit on every arrow carries as many directed
s–t paths as its value, no two of which traverse a common arrow: every arrow of these paths
carries one unit of the flow.
An integer s–t flow carries a family of directed s–t paths, repetitions allowed, with
as many members as its value, such that every vertex v ≠ s lies on at most as many members as the
total value entering v.