pub fn inverse<G, H>(g: G) -> H
Expand description
Returns the inverse directed graph of g
.
For $G=(V,A)$ the returned graph is $G=(V,A’)$ with $A’ := {(v,u) \colon (u,v) \in A}$.
§Example
use rs_graph::{LinkedListGraph, Buildable, Builder};
use rs_graph::algorithms::inverse;
use rs_graph::traits::*;
let g = LinkedListGraph::<usize>::new_with(|b| {
let nodes = b.add_nodes(18);
for &u in &nodes {
for &v in &nodes {
if b.node2id(v) > 0 && b.node2id(u) % b.node2id(v) == 0 {
b.add_edge(u, v);
}
}
}
});
let h: LinkedListGraph = inverse(&g);
assert_eq!(g.num_nodes(), h.num_nodes());
assert_eq!(g.num_edges(), h.num_edges());
for e in h.edges() {
let (u,v) = (h.node_id(h.src(e)), h.node_id(h.snk(e)));
assert!(u > 0 && v % u == 0);
}
Another example to create a star with all edges directed to the center.
use rs_graph::LinkedListGraph;
use rs_graph::traits::*;
use rs_graph::classes::star;
use rs_graph::algorithms::inverse;
type G = LinkedListGraph<usize>;
let g: G = inverse(&star::<G>(42));
assert_eq!(g.num_nodes(), 43);
for e in g.edges() {
let (u,v) = (g.node_id(g.src(e)), g.node_id(g.snk(e)));
assert!(u > 0 && v == 0);
}