using System; using System.Collections.Generic; namespace Advanced.Algorithms.DataStructures.Graph; /// /// Directed graph. /// /// public interface IDiGraph { bool IsWeightedGraph { get; } IDiGraphVertex ReferenceVertex { get; } IEnumerable> VerticesAsEnumberable { get; } int VerticesCount { get; } bool ContainsVertex(T value); IDiGraphVertex GetVertex(T key); bool HasEdge(T source, T destination); IDiGraph Clone(); } public interface IDiGraphVertex { T Key { get; } IEnumerable> OutEdges { get; } IEnumerable> InEdges { get; } int OutEdgeCount { get; } int InEdgeCount { get; } IDiEdge GetOutEdge(IDiGraphVertex targetVertex); } public interface IDiEdge { T TargetVertexKey { get; } IDiGraphVertex TargetVertex { get; } TW Weight() where TW : IComparable; } internal class DiEdge : IDiEdge where TC : IComparable { private readonly object weight; internal DiEdge(IDiGraphVertex target, TC weight) { TargetVertex = target; this.weight = weight; } public T TargetVertexKey => TargetVertex.Key; public IDiGraphVertex TargetVertex { get; } public TW Weight() where TW : IComparable { return (TW)weight; } }