weavatrix_graph/algo/flow/min_cost/
result.rs1use 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}