Graphs topic
Graph data structures, sorting, traversal, and graph algorithms & utilities.
Table of Contents:
Walkables
Sector provides foundational sequential access to graph nodes, or
Walkable
, which is to iterable what Graph
is to List
, representing a
collection of nodes and edges:
void example(Walkable<String> walkable) {
for (final node in walkable.roots) {
for (final successor in walkable.successors(node)) {
print('$node -> $successor');
}
}
}
Ephemeral collections can be created without needing a concrete implementation:
// a -> b -> c
Walkable.linear(['a', 'b', 'c']);
// a -> b -> a
Walkable.circular(['a', 'b']);
// a
// / \
// b - c
Walkable.star(['a', 'b', 'c']);
See also WeightedWalkable
, a variant of Walkable
that includes floating
point edge weights, and can be derived using Walkable.asWeighted
; algorithms
that can operate on both types of walkables can be implemented in terms of
WalkableBase
(which many algorithms in this package do).
Graphs
Graphs are a collection of nodes, and edges between nodes.
Sector contains an interface and concrete implementation, Graph
and
AdjacencyListGraph
, respectively, which is an
adjacency list
representation of a graph, ideal for sparse (few edges) graphs:
final graph = Graph<String>();
graph.addEdge(Edge('a', 'b'));
graph.addEdge(Edge('b', 'c'));
print(graph.roots); // ['a']
print(graph.successors('b')); // ['c']
By default, most graphs are directed, meaning an edge has an explicit
source and target node. However, undirected graphs can be created by
using directed: false
, or by mixing-in the UndirectedGraph
mixin:
final graph = Graph<String>(directed: false);
graph.addEdge(Edge('a', 'b'));
print(graph.successors('a')); // ['b']
print(graph.successors('b')); // ['a']
// ...
final class MyUndirectedGraph<E> = MyGraph<E> with UndirectedGraph<E> {}
Sorting and Traversing
A few utilities are provided for sorting and traversing graphs:
topologicalSort
for sorting a directed acyclic graph dependency order.stronglyConnected
and for finding cycles (strong components) in a graph.breadthFirst
for traversing a graph in breadth-first (shallower-first) order.depthFirst
for traversing a graph in depth-first (deeper-first) order.
Classes
-
AdjacencyListGraph<
E> Graphs - An unweighted graph suitable for sparse graphs.
-
Edge<
E> Graphs - A graph edge connecting two nodes.
-
Graph<
E> Graphs - A collection of nodes and edges where edges connect exactly two nodes.
-
GraphBase<
E> Graphs - A base interface for graphs.
-
ScalarEvent<
E> Graphs - A captured Tracer.pushScalar event.
-
SkipEvent<
E> Graphs - A captured Tracer.onSkip event.
-
TraceEvent<
E> Graphs - An event captured by a TraceRecorder.
-
Tracer<
E> Graphs - A utility for capturing events during a graph traversal or pathfinding.
-
TraceRecorder<
E> Graphs - A utility for recording events during a graph traversal or pathfinding.
-
VisitEvent<
E> Graphs - A captured Tracer.onVisit event.
-
Walkable<
E> Graphs - A collection of values, or "nodes", that can be traversed incrementally.
-
WalkableBase<
E> Graphs - A base interface for walkable collections.
-
WeightedEdge<
V> Graphs - A weighted graph edge connecting two nodes.
-
WeightedGraph<
V> Graphs - A graph where edges have an associated weight, or "cost", a double value.
-
WeightedWalkable<
E> Graphs - A collection of nodes and edges that can be traversed incrementally.
Mixins
-
UndirectedGraph<
E> Graphs - A mixin that that adapts a Graph to be undirected.
Functions
-
breadthFirst<
T> (WalkableBase< GraphsT> graph, {required T start, Tracer<T> ? tracer}) → Iterable<T> -
Visits nodes in a
graph
structure, shallowest nodes first, fromstart
. -
depthFirst<
T> (WalkableBase< GraphsT> graph, {required T start, Tracer<T> ? tracer}) → Iterable<T> -
Visits nodes in a
graph
structure, deepest nodes first, fromstart
. -
stronglyConnected<
T> (WalkableBase< GraphsT> graph, {Iterable<T> ? from, Tracer<T> ? tracer}) → List<List< T> > -
Partitions nodes reachable in a
graph
into strongly connected components. -
topologicalSort<
T> (Iterable< GraphsT> roots, {required Iterable<T> successors(T)}) → List<T> - Returns a topological sort of the directed edges provided, if one exists.
Typedefs
-
Crawler<
E> = Iterable< T> Function<T extends E>(WalkableBase< GraphsT> nodes, {required T start, Tracer<T> ? tracer}) -
A function that visits
nodes
in a graph structure starting fromstart
.
Exceptions / Errors
-
CycleException<
T> Graphs - Indicates a cycle was detected in a graph expected to be acyclic.