fix random generator capacity, add Dinic's algo, add options for filtering empty flows & displaying residual graph

This commit is contained in:
2025-03-25 18:24:09 +01:00
parent 681cdee139
commit 6b17e583e6
4 changed files with 169 additions and 9 deletions

View File

@@ -1,3 +1,4 @@
use petgraph::data::Build;
use petgraph::stable_graph::{StableGraph, NodeIndex};
use petgraph::{Directed};
use egui_graphs::{default_edge_transform, default_node_transform, to_graph_custom, DefaultEdgeShape, DefaultNodeShape, Graph};
@@ -70,9 +71,10 @@ impl MaxflowProblem {
// otherwise insert the edge and its residual edge
inserted_edges.push((node1, node2));
inserted_edges.push((node2, node1));
let capacity: u64 = rng.gen_range(1..=max_capacity);
graph.add_edge(node1, node2, (0, capacity));
graph.add_edge(node2, node1, (0, capacity));
let capacity1: u64 = rng.gen_range(1..=max_capacity);
let capacity2: u64 = rng.gen_range(1..=max_capacity);
graph.add_edge(node1, node2, (0, capacity1));
graph.add_edge(node2, node1, (0, capacity2));
}
}
@@ -101,6 +103,14 @@ impl MaxflowProblem {
}
}
// set all flows back to zero
pub fn reset_flow(&mut self) {
for edge in self.g.edge_indices().collect::<Vec<_>>() {
let weight = self.g.edge_weight_mut(edge).expect("edge not found");
(*weight).0 = 0;
}
}
pub fn to_gui_graph(&self) -> Graph<(f32, f32), (u64, u64), Directed, u32, DefaultNodeShape, CustomEdgeShape> {
let mut graph = to_graph_custom(&self.g,
|n| {