@@ -11,24 +11,25 @@ namespace Advanced.Algorithms.DataStructures.Graph.AdjacencyList
1111 /// </summary>
1212 public class DiGraph < T > : IGraph < T > , IDiGraph < T > , IEnumerable < T >
1313 {
14- public int VerticesCount => Vertices . Count ;
15- internal Dictionary < T , DiGraphVertex < T > > Vertices { get ; set ; }
14+ private Dictionary < T , DiGraphVertex < T > > vertices { get ; set ; }
15+
16+ public int VerticesCount => vertices . Count ;
1617 public bool IsWeightedGraph => false ;
1718
1819 public DiGraph ( )
1920 {
20- Vertices = new Dictionary < T , DiGraphVertex < T > > ( ) ;
21+ vertices = new Dictionary < T , DiGraphVertex < T > > ( ) ;
2122 }
2223
2324 /// <summary>
2425 /// Return a reference vertex to start traversing Vertices
2526 /// Time complexity: O(1).
2627 /// </summary>
27- public DiGraphVertex < T > ReferenceVertex
28+ private DiGraphVertex < T > referenceVertex
2829 {
2930 get
3031 {
31- using ( var enumerator = Vertices . GetEnumerator ( ) )
32+ using ( var enumerator = vertices . GetEnumerator ( ) )
3233 {
3334 if ( enumerator . MoveNext ( ) )
3435 {
@@ -41,15 +42,15 @@ public DiGraphVertex<T> ReferenceVertex
4142 }
4243 }
4344
44- IDiGraphVertex < T > IDiGraph < T > . ReferenceVertex => ReferenceVertex ;
45- IGraphVertex < T > IGraph < T > . ReferenceVertex => ReferenceVertex ;
45+ IDiGraphVertex < T > IDiGraph < T > . ReferenceVertex => referenceVertex ;
46+ IGraphVertex < T > IGraph < T > . ReferenceVertex => referenceVertex ;
4647
4748
4849 /// <summary>
4950 /// Add a new vertex to this graph.
5051 /// Time complexity: O(1).
5152 /// </summary>
52- public DiGraphVertex < T > AddVertex ( T value )
53+ public void AddVertex ( T value )
5354 {
5455 if ( value == null )
5556 {
@@ -58,9 +59,7 @@ public DiGraphVertex<T> AddVertex(T value)
5859
5960 var newVertex = new DiGraphVertex < T > ( value ) ;
6061
61- Vertices . Add ( value , newVertex ) ;
62-
63- return newVertex ;
62+ vertices . Add ( value , newVertex ) ;
6463 }
6564
6665 /// <summary>
@@ -74,22 +73,22 @@ public void RemoveVertex(T value)
7473 throw new ArgumentNullException ( ) ;
7574 }
7675
77- if ( ! Vertices . ContainsKey ( value ) )
76+ if ( ! vertices . ContainsKey ( value ) )
7877 {
7978 throw new Exception ( "Vertex not in this graph." ) ;
8079 }
8180
82- foreach ( var vertex in Vertices [ value ] . InEdges )
81+ foreach ( var vertex in vertices [ value ] . InEdges )
8382 {
84- vertex . OutEdges . Remove ( Vertices [ value ] ) ;
83+ vertex . OutEdges . Remove ( vertices [ value ] ) ;
8584 }
8685
87- foreach ( var vertex in Vertices [ value ] . OutEdges )
86+ foreach ( var vertex in vertices [ value ] . OutEdges )
8887 {
89- vertex . InEdges . Remove ( Vertices [ value ] ) ;
88+ vertex . InEdges . Remove ( vertices [ value ] ) ;
9089 }
9190
92- Vertices . Remove ( value ) ;
91+ vertices . Remove ( value ) ;
9392 }
9493
9594 /// <summary>
@@ -103,18 +102,18 @@ public void AddEdge(T source, T dest)
103102 throw new ArgumentException ( ) ;
104103 }
105104
106- if ( ! Vertices . ContainsKey ( source ) || ! Vertices . ContainsKey ( dest ) )
105+ if ( ! vertices . ContainsKey ( source ) || ! vertices . ContainsKey ( dest ) )
107106 {
108107 throw new Exception ( "Source or Destination Vertex is not in this graph." ) ;
109108 }
110109
111- if ( Vertices [ source ] . OutEdges . Contains ( Vertices [ dest ] ) || Vertices [ dest ] . InEdges . Contains ( Vertices [ source ] ) )
110+ if ( vertices [ source ] . OutEdges . Contains ( vertices [ dest ] ) || vertices [ dest ] . InEdges . Contains ( vertices [ source ] ) )
112111 {
113112 throw new Exception ( "Edge already exists." ) ;
114113 }
115114
116- Vertices [ source ] . OutEdges . Add ( Vertices [ dest ] ) ;
117- Vertices [ dest ] . InEdges . Add ( Vertices [ source ] ) ;
115+ vertices [ source ] . OutEdges . Add ( vertices [ dest ] ) ;
116+ vertices [ dest ] . InEdges . Add ( vertices [ source ] ) ;
118117 }
119118
120119 /// <summary>
@@ -128,19 +127,19 @@ public void RemoveEdge(T source, T dest)
128127 throw new ArgumentException ( ) ;
129128 }
130129
131- if ( ! Vertices . ContainsKey ( source ) || ! Vertices . ContainsKey ( dest ) )
130+ if ( ! vertices . ContainsKey ( source ) || ! vertices . ContainsKey ( dest ) )
132131 {
133132 throw new Exception ( "Source or Destination Vertex is not in this graph." ) ;
134133 }
135134
136- if ( ! Vertices [ source ] . OutEdges . Contains ( Vertices [ dest ] )
137- || ! Vertices [ dest ] . InEdges . Contains ( Vertices [ source ] ) )
135+ if ( ! vertices [ source ] . OutEdges . Contains ( vertices [ dest ] )
136+ || ! vertices [ dest ] . InEdges . Contains ( vertices [ source ] ) )
138137 {
139138 throw new Exception ( "Edge do not exists." ) ;
140139 }
141140
142- Vertices [ source ] . OutEdges . Remove ( Vertices [ dest ] ) ;
143- Vertices [ dest ] . InEdges . Remove ( Vertices [ source ] ) ;
141+ vertices [ source ] . OutEdges . Remove ( vertices [ dest ] ) ;
142+ vertices [ dest ] . InEdges . Remove ( vertices [ source ] ) ;
144143 }
145144
146145 /// <summary>
@@ -149,42 +148,33 @@ public void RemoveEdge(T source, T dest)
149148 /// </summary>
150149 public bool HasEdge ( T source , T dest )
151150 {
152- if ( ! Vertices . ContainsKey ( source ) || ! Vertices . ContainsKey ( dest ) )
151+ if ( ! vertices . ContainsKey ( source ) || ! vertices . ContainsKey ( dest ) )
153152 {
154153 throw new ArgumentException ( "source or destination is not in this graph." ) ;
155154 }
156155
157- return Vertices [ source ] . OutEdges . Contains ( Vertices [ dest ] )
158- && Vertices [ dest ] . InEdges . Contains ( Vertices [ source ] ) ;
156+ return vertices [ source ] . OutEdges . Contains ( vertices [ dest ] )
157+ && vertices [ dest ] . InEdges . Contains ( vertices [ source ] ) ;
159158 }
160159
161160 public IEnumerable < T > OutEdges ( T vertex )
162161 {
163- if ( ! Vertices . ContainsKey ( vertex ) )
162+ if ( ! vertices . ContainsKey ( vertex ) )
164163 {
165164 throw new ArgumentException ( "vertex is not in this graph." ) ;
166165 }
167166
168- return Vertices [ vertex ] . OutEdges . Select ( x => x . Key ) ;
167+ return vertices [ vertex ] . OutEdges . Select ( x => x . Key ) ;
169168 }
170169
171170 public IEnumerable < T > InEdges ( T vertex )
172171 {
173- if ( ! Vertices . ContainsKey ( vertex ) )
172+ if ( ! vertices . ContainsKey ( vertex ) )
174173 {
175174 throw new ArgumentException ( "vertex is not in this graph." ) ;
176175 }
177176
178- return Vertices [ vertex ] . InEdges . Select ( x => x . Key ) ;
179- }
180-
181- /// <summary>
182- /// Returns the vertex object with given value.
183- /// Time complexity: O(1).
184- /// </summary>
185- public DiGraphVertex < T > FindVertex ( T value )
186- {
187- return Vertices . ContainsKey ( value ) ? Vertices [ value ] : null ;
177+ return vertices [ vertex ] . InEdges . Select ( x => x . Key ) ;
188178 }
189179
190180 /// <summary>
@@ -194,12 +184,12 @@ public DiGraph<T> Clone()
194184 {
195185 var newGraph = new DiGraph < T > ( ) ;
196186
197- foreach ( var vertex in Vertices )
187+ foreach ( var vertex in vertices )
198188 {
199189 newGraph . AddVertex ( vertex . Key ) ;
200190 }
201191
202- foreach ( var vertex in Vertices )
192+ foreach ( var vertex in vertices )
203193 {
204194 foreach ( var edge in vertex . Value . OutEdges )
205195 {
@@ -212,17 +202,17 @@ public DiGraph<T> Clone()
212202
213203 public bool ContainsVertex ( T value )
214204 {
215- return Vertices . ContainsKey ( value ) ;
205+ return vertices . ContainsKey ( value ) ;
216206 }
217207
218208 public IDiGraphVertex < T > GetVertex ( T value )
219209 {
220- return Vertices [ value ] ;
210+ return vertices [ value ] ;
221211 }
222212
223213 IGraphVertex < T > IGraph < T > . GetVertex ( T key )
224214 {
225- return Vertices [ key ] ;
215+ return vertices [ key ] ;
226216 }
227217
228218 IDiGraph < T > IDiGraph < T > . Clone ( )
@@ -237,28 +227,24 @@ IGraph<T> IGraph<T>.Clone()
237227
238228 public IEnumerator GetEnumerator ( )
239229 {
240- return Vertices . Select ( x => x . Key ) . GetEnumerator ( ) ;
230+ return vertices . Select ( x => x . Key ) . GetEnumerator ( ) ;
241231 }
242232
243233 IEnumerator < T > IEnumerable < T > . GetEnumerator ( )
244234 {
245235 return GetEnumerator ( ) as IEnumerator < T > ;
246236 }
247237
248- public IEnumerable < IGraphVertex < T > > VerticesAsEnumberable => Vertices . Select ( x => x . Value ) ;
249- IEnumerable < IDiGraphVertex < T > > IDiGraph < T > . VerticesAsEnumberable => Vertices . Select ( x => x . Value ) ;
238+ public IEnumerable < IGraphVertex < T > > VerticesAsEnumberable => vertices . Select ( x => x . Value ) ;
239+ IEnumerable < IDiGraphVertex < T > > IDiGraph < T > . VerticesAsEnumberable => vertices . Select ( x => x . Value ) ;
250240 }
251241
252- /// <summary>
253- /// DiGraph vertex for adjacency list Graph implementation.
254- /// IEnumerable enumerates all the outgoing edge destination vertices.
255- /// </summary>
256- public class DiGraphVertex < T > : IDiGraphVertex < T > , IGraphVertex < T > , IEnumerable < T >
242+ internal class DiGraphVertex < T > : IDiGraphVertex < T > , IGraphVertex < T > , IEnumerable < T >
257243 {
258244 public T Key { get ; set ; }
259245
260- public HashSet < DiGraphVertex < T > > OutEdges { get ; set ; }
261- public HashSet < DiGraphVertex < T > > InEdges { get ; set ; }
246+ public HashSet < DiGraphVertex < T > > OutEdges { get ; }
247+ public HashSet < DiGraphVertex < T > > InEdges { get ; }
262248
263249 IEnumerable < IDiEdge < T > > IDiGraphVertex < T > . OutEdges => OutEdges . Select ( x => new DiEdge < T , int > ( x , 1 ) ) ;
264250 IEnumerable < IDiEdge < T > > IDiGraphVertex < T > . InEdges => InEdges . Select ( x => new DiEdge < T , int > ( x , 1 ) ) ;
@@ -294,6 +280,5 @@ public IEnumerator<T> GetEnumerator()
294280 {
295281 return OutEdges . Select ( x => x . Key ) . GetEnumerator ( ) ;
296282 }
297-
298283 }
299284}
0 commit comments