Struct GraphNum

Source
pub struct GraphNum { /* private fields */ }

Implementations§

Source§

impl GraphNum

Source

pub fn new(n: usize) -> Self

Source

pub fn add_vertex(&mut self, vertex: usize)

Adds a new vertex to the graph

Source

pub fn add_oriented_edge(&mut self, from: usize, to: usize, weight: f32)

Adds a new oriented edge to the graph

Source

pub fn bfs(&self, from: usize) -> Vec<VertexNumProperties>

BFS (Breadth-First Search) algorithm. Returns an ancestor vector along the graph traversal path

 use librualg::graph::GraphNum;

 let mut graph = GraphNum::new(20);
 graph.add_vertex(1);
 graph.add_vertex(2);
 graph.add_vertex(3);
 graph.add_vertex(4);
 graph.add_vertex(5);
 graph.add_vertex(8);
 graph.add_vertex(17);
 graph.add_oriented_edge(1, 2, 0.0);
 graph.add_oriented_edge(2, 3, 0.0);
 graph.add_oriented_edge(2, 4, 0.0);
 graph.add_oriented_edge(2, 5, 0.0);
 graph.add_oriented_edge(4, 8, 0.0);
 graph.add_oriented_edge(8, 17, 0.0);
 let parents = graph.bfs(1);
 assert_eq!(graph.search_path(5, &parents).unwrap(), vec![1, 2, 5]);
 assert_eq!(graph.search_path(17, &parents).unwrap(), vec![1, 2, 4, 8, 17]);

 graph.add_oriented_edge(17, 1, 0.0);
 let parents = graph.bfs(1);
 assert_eq!(graph.search_path(5, &parents).unwrap(), vec![1, 2, 5]);
  assert_eq!(graph.search_path(17, &parents).unwrap(), vec![1, 2, 4, 8, 17]);

 let parents = graph.bfs(11);
 assert_eq!(graph.search_path(11, &parents), None);
Source

pub fn dfs(&self, from: usize) -> Vec<VertexNumProperties>

DFS (Depth-First Search) algorithm. Returns an ancestor vector along the graph traversal path

 use librualg::graph::GraphNum;

 let mut graph = GraphNum::new(10);

 graph.add_vertex(1);
 graph.add_vertex(2);
 graph.add_vertex(3);
 graph.add_vertex(5);
 graph.add_oriented_edge(1, 2, 0.0);
 graph.add_oriented_edge(2, 3, 0.0);
 graph.add_oriented_edge(3, 5, 0.0);

 let res = graph.dfs(1);
 assert_eq!(graph.search_path(5, &res).unwrap(), vec![1, 2, 3, 5]);
Source

pub fn dijkstra( &self, from: usize, ) -> (Vec<VertexNumProperties>, Vec<Option<f32>>)

Dijkstra algorithm. Returns an ancestor vector along the graph traversal path and distances to the other vertexs

 use librualg::graph::GraphNum;

 let mut graph = GraphNum::new(10);

 graph.add_vertex(1);
 graph.add_vertex(2);
 graph.add_vertex(3);
 graph.add_vertex(5);
 graph.add_vertex(7);

 graph.add_oriented_edge(1, 2, 2.0);
 graph.add_oriented_edge(2, 3, 5.0);
 graph.add_oriented_edge(3, 5, 7.0);
 graph.add_oriented_edge(1, 5, 19.0);

 let (parents, distances) = graph.dijkstra(1);
 assert_eq!(graph.search_path(5, &parents).unwrap(), vec![1, 2, 3, 5]);
 assert_eq!(graph.search_path(3, &parents).unwrap(), vec![1, 2, 3]);
 assert_eq!(distances[5].unwrap(), 14.0);
 assert_eq!(distances[7], None);
Source

pub fn connected_components(&self) -> Vec<Vec<usize>>

Get connected components

 use librualg::graph::GraphNum;

 let mut graph = GraphNum::new(20);
 graph.add_vertex(1);
 graph.add_vertex(2);
 graph.add_vertex(3);
 graph.add_vertex(4);
 graph.add_vertex(5);
 graph.add_vertex(6);
 graph.add_vertex(7);
 graph.add_vertex(8);
 graph.add_vertex(9);
 graph.add_vertex(10);
 graph.add_vertex(11);
 graph.add_oriented_edge(1, 2, 0.0);
 graph.add_oriented_edge(2, 3, 0.0);
 graph.add_oriented_edge(3, 4, 0.0);

 graph.add_oriented_edge(5, 6, 0.0);
 graph.add_oriented_edge(6, 7, 0.0);

 graph.add_oriented_edge(8, 9, 0.0);
 graph.add_oriented_edge(9, 10, 0.0);
 graph.add_oriented_edge(10, 11, 0.0);

 let components = graph.connected_components();
 assert_eq!(components[0], [1, 2, 3, 4]);
 assert_eq!(components[1], [5, 6, 7]);
 assert_eq!(components[2], [8, 9, 10, 11]);
Source

pub fn strongly_connected_components(&self) -> Vec<Vec<usize>>

Source

pub fn topological_sort(&self) -> Vec<usize>

Source

pub fn kruskal(&self) -> GraphNum

Kruskal’s algorithm

use librualg::graph::GraphNum;

let mut graph = GraphNum::new(20);

graph.add_vertex(1);
graph.add_vertex(2);
graph.add_vertex(3);
graph.add_vertex(4);
graph.add_vertex(5);
graph.add_vertex(6);
graph.add_vertex(7);

graph.add_oriented_edge(1, 2, 7.0);
graph.add_oriented_edge(2, 1, 7.0);
graph.add_oriented_edge(1, 4, 5.0);
graph.add_oriented_edge(4, 1, 5.0);
graph.add_oriented_edge(2, 3, 8.0);
graph.add_oriented_edge(3, 2, 8.0);
graph.add_oriented_edge(2, 5, 7.0);
graph.add_oriented_edge(5, 2, 7.0);
graph.add_oriented_edge(2, 4, 9.0);
graph.add_oriented_edge(4, 2, 9.0);
graph.add_oriented_edge(3, 5, 5.0);
graph.add_oriented_edge(5, 3, 5.0);
graph.add_oriented_edge(5, 7, 9.0);
graph.add_oriented_edge(7, 5, 9.0);
graph.add_oriented_edge(5, 6, 8.0);
graph.add_oriented_edge(6, 5, 8.0);
graph.add_oriented_edge(5, 4, 15.0);
graph.add_oriented_edge(4, 5, 15.0);
graph.add_oriented_edge(6, 7, 11.0);
graph.add_oriented_edge(7, 6, 11.0);
graph.add_oriented_edge(6, 4, 6.0);
graph.add_oriented_edge(4, 6, 6.0);
let tree = graph.kruskal();
assert_eq!(vec![1, 2, 5, 7], tree.search_path(7, &tree.bfs(1)).unwrap());
assert_eq!(vec![1, 2, 5, 3], tree.search_path(3, &tree.bfs(1)).unwrap());
Source

pub fn search_path( &self, target: usize, parents: &[VertexNumProperties], ) -> Option<Vec<usize>>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.