traitgraph_algo/
eulerian.rs1use traitgraph::interface::StaticGraph;
2
3pub fn decomposes_into_eulerian_cycles<Graph: StaticGraph>(graph: &Graph) -> bool {
5 for node_index in graph.node_indices() {
6 if graph.in_degree(node_index) != graph.out_degree(node_index) {
7 return false;
8 }
9 }
10
11 true
12}
13
14pub fn find_non_eulerian_nodes<Graph: StaticGraph>(graph: &Graph) -> Vec<Graph::NodeIndex> {
16 let mut result = Vec::new();
17 for node_index in graph.node_indices() {
18 if graph.in_degree(node_index) != graph.out_degree(node_index) {
19 result.push(node_index);
20 }
21 }
22 result
23}
24
25pub fn find_non_eulerian_nodes_with_differences<Graph: StaticGraph>(
27 graph: &Graph,
28) -> Vec<(Graph::NodeIndex, isize)> {
29 let mut node_indices_and_differences = Vec::new();
30 for node_index in graph.node_indices() {
31 let difference =
32 graph.out_degree(node_index) as isize - graph.in_degree(node_index) as isize;
33 if difference != 0 {
34 node_indices_and_differences.push((node_index, difference));
35 }
36 }
37 node_indices_and_differences
38}