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