Skip to main content

weavatrix_graph/algo/flow/min_cost/
result.rs

1use super::super::common::FlowInput;
2use super::super::cut::residual_reachable;
3use crate::{IndexGraphView, Vec};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct MinCostFlow<Node, Edge> {
7    value: u64,
8    cost: i128,
9    edge_flows: Vec<(Edge, u64)>,
10    source_side: Vec<Node>,
11}
12
13impl<Node, Edge> MinCostFlow<Node, Edge> {
14    #[must_use]
15    pub const fn value(&self) -> u64 {
16        self.value
17    }
18
19    #[must_use]
20    pub const fn cost(&self) -> i128 {
21        self.cost
22    }
23
24    #[must_use]
25    pub fn edge_flows(&self) -> &[(Edge, u64)] {
26        &self.edge_flows
27    }
28
29    #[must_use]
30    pub fn source_side(&self) -> &[Node] {
31        &self.source_side
32    }
33}
34
35pub(super) fn finish<G>(
36    graph: &G,
37    source: G::Node,
38    input: FlowInput<G::Edge>,
39    flows: &[u64],
40    value: u64,
41    cost: i128,
42) -> MinCostFlow<G::Node, G::Edge>
43where
44    G: IndexGraphView,
45{
46    let reachable = residual_reachable(graph, source, &input.capacities, flows);
47    MinCostFlow {
48        value,
49        cost,
50        edge_flows: input
51            .edges
52            .into_iter()
53            .map(|edge| (edge, flows[G::edge_slot(edge)]))
54            .collect(),
55        source_side: graph
56            .node_indices()
57            .filter(|node| reachable[G::node_slot(*node)])
58            .collect(),
59    }
60}