Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

CI pub package package publisher

Graph algorithms that do not specify a particular approach for representing a Graph.

Each algorithm is a top level function which takes callback arguments that provide the mechanism for traversing the graph. For example, two common approaches for representing a graph:

class AdjacencyListGraph<T> {
  Map<T, List<T>> nodes;
  // ...
}
class TreeGraph<T> {
  Node<T> root;
  // ...
}
class Node<T> {
  List<Node<T>> edges;
  T value;
}

Any representation can be adapted to the callback arguments.

  • Algorithms which need to traverse the graph take an edges callback which provides the immediate neighbors of a given node.
  • Algorithms which need to associate unique data with each node in the graph allow passing equals and/or hashCode callbacks if the unique data type does not correctly or efficiently implement operator== or get hashCode.

Algorithms that support graphs which are resolved asynchronously will have similar callbacks which return FutureOr.

import 'package:graphs/graphs.dart';

void sendMessage() {
  final network = AdjacencyListGraph();
  // ...
  final route = shortestPath(
      sender, receiver, (node) => network.nodes[node] ?? const []);
}

void resolveBuildOrder() {
  final dependencies = TreeGraph();
  // ...
  final buildOrder = topologicalSort([dependencies.root], (node) => node.edges);
}