74 lines
2.7 KiB
Markdown
74 lines
2.7 KiB
Markdown
# grapherity
|
|
|
|
Graph models and algorithms.
|
|
|
|
This crate provides data structures to model graphs and to perform algorithms on these data structures. The functionality presented is designed to be easy to use, flexible, and performant.
|
|
|
|
Currently supported are:
|
|
|
|
* Undirected graph types `Graph` and `AppendGraph`, built on a flat, index-based adjacency list,
|
|
* Maps to freely associate custom data with vertices and edges,
|
|
* Connectivity and pathing algorithms: Dijkstra's algorithm, DFS, and BFS in different variants,
|
|
* Exposed traits to implement custom graph data structures or algorithms.
|
|
|
|
For more information, see the [documentation](https://docs.rs/grapherity/latest/grapherity/).
|
|
|
|
## Example
|
|
|
|
```
|
|
// Brings commonly used traits into scope.
|
|
use grapherity::prelude::*;
|
|
use grapherity::models::Graph;
|
|
use grapherity::algorithms;
|
|
|
|
let mut graph = Graph::new();
|
|
// Creates a map for edge weights with a default weight.
|
|
let mut weights = graph.edge_map(1);
|
|
// Adds three vertices and two edges.
|
|
let v1 = graph.add_vertex();
|
|
let v2 = graph.add_vertex();
|
|
let v3 = graph.add_vertex();
|
|
graph.add_edge(v1, v2);
|
|
let e = graph.add_edge(v2, v3);
|
|
// Sets a non-default weight for the second edge.
|
|
weights[e] = 5;
|
|
|
|
// Checks the number of vertices.
|
|
assert_eq!(graph.vertex_count(), 3);
|
|
// Checks the number of edges.
|
|
assert_eq!(graph.edge_count(), 2);
|
|
// Checks that v1 and v2 are adjacent.
|
|
assert!(graph.are_adjacent(v1, v2));
|
|
// Checks that v1 and v3 are not adjacent.
|
|
assert!(!graph.are_adjacent(v1, v3));
|
|
// Checks the sum of all vertex degrees.
|
|
let sum: usize = graph.vertices().map(|v| graph.degree(v)).sum();
|
|
assert_eq!(sum, 1 + 2 + 1);
|
|
|
|
// Calls Dijkstra's algorithm using the edge weights to find the shortest path from v1 to v3.
|
|
let result = algorithms::dijkstra(&graph, v1, |e| weights[e]);
|
|
assert_eq!(result.distances[v3], Some(1 + 5));
|
|
assert_eq!(result.predecessors[v3], Some(v2));
|
|
|
|
// Deletes the middle vertex and its incident edges.
|
|
graph.delete_vertex(v2);
|
|
|
|
// Calls Dijkstra's algorithm again on the now disconnected graph.
|
|
let result = algorithms::dijkstra(&graph, v1, |e| weights[e]);
|
|
assert_eq!(result.distances[v3], None);
|
|
assert_eq!(result.predecessors[v3], None);
|
|
```
|
|
|
|
## License
|
|
|
|
This project is dual-licensed under the terms of both:
|
|
|
|
- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
|
|
- MIT license ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/license/mit)
|
|
|
|
You may choose either license for your use of this software.
|
|
|
|
### Contributions
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
|