A type that stores a pair of nodes representing an edge in the graph.
We need to define a custom type for these so we can define a hash function on graph edges, in order to more efficiently use them in hashmaps (dictionaries)
"""
structGraphEdge
structHalfWeightedEdge
a::Int
b::Int
weight::Base.RefValue{UInt8}
end
"""
Define a hash on GraphEdge such that `hash(a,b) = hash(b,a)` (hash is commutative).
This is helpful because then we only need to store (a,b) in the graph edges weights dictionary, rather than both (a,b) and (b,a).
"""
function Base.hash(e::GraphEdge)
returnhash(minmax(e.a,e.b))
end
"""
Define symmetric edge equality, matches the hash function.
"""
function Base.isequal(e1::GraphEdge,e2::GraphEdge)