Provides numerous graph theory based Graph Collections

# Graph theory

Graph theory is the study of graphs, which are mathematical structures used to model pairwise relations between objects. A graph in this context is made up of vertices (also called nodes or points) which are connected by edges (also called links or lines).

## Undirected Graph

UndirectedGraph

All edges of the undirected graph are bidirectional

## Directed Graph

DirectedGraph

All edges of the directed graph are directed from one vertex to another

## Link Graph

LinkGraph

Union of directed graphs and undirected graphs

This means that only edge relationships can be stored and values cannot be stored.

# Multigraph

A multigraph (in contrast to a simple graph) is a graph which is permitted to have multiple edges (also called parallel edges`1`

), that is, edges that have the same end nodes. Thus two vertices may be connected by more than one edge.

The base implementation of this library is part of the multigraph

It allows each `key`

to produce an edge, but does not allow 2 `key`

equal edges

Each `key`

can represent an edge between two nodes that store values

It is like allowing red and blue edges to exist together but not allowing 2 red or 2 blue

## Undirected Value Graph

UndirectedValueGraph

An undirected graph of values can be set

## Directed Value Graph

DirectedValueGraph

An directed graph of values can be set

## Graph

Graph

Union of directed graphs, undirected graphs, directed value graphs, undirected value graphs

# API reference

# Example

```
import 'package:graph_collection/graph.dart';
void main() {
final g = Graph();
// Base
g.add(1);
g.has(1);
g.remove(1);
// Undirected Graph
g.link(1, 2);
g.hasLink(1, 2);
g.unLink(1, 2);
// Directed Graph
g.linkTo(1, 2);
g.hasLinkTo(1, 2);
g.unLinkTo(1, 2);
// Undirected value Graph
g.set(1, 2, 3, 4);
g.hasEdge(1, 2, 3);
g.get(1, 2, 3);
g.unSet(1, 2, 3);
g.setBy<int>(1, 2, 3);
g.hasEdgeBy<int>(1, 2);
g.getBy<int>(1, 2);
g.unSetBy<int>(1, 2);
// Directed value Graph
g.setTo(1, 2, 3, 4);
g.hasEdgeTo(1, 2, 3);
g.get(1, 2, 3);
g.unSetTo(1, 2, 3);
g.setToBy<int>(1, 2, 3);
g.hasEdgeToBy<int>(1, 2);
g.getBy<int>(1, 2);
g.unSetToBy<int>(1, 2);
}
```