@@ -3557,81 +3557,58 @@ public object VisitUsingExpression(UsingExpressionAst usingExpressionAst)
3557
3557
}
3558
3558
3559
3559
/// Class to represent a directed graph
3560
- public class Digraph < T >
3560
+ public class Digraph
3561
3561
{
3562
- public int NumVertices
3563
- {
3564
- get { return graph . Count ; }
3565
- }
3566
-
3567
3562
private List < List < int > > graph ;
3568
- private Dictionary < T , int > vertexIndexMap ;
3569
-
3570
3563
3571
- private int GetIndex ( T vertex )
3564
+ public Digraph ( )
3572
3565
{
3573
- int idx ;
3574
- return vertexIndexMap . TryGetValue ( vertex , out idx ) ? idx : - 1 ;
3566
+ graph = new List < List < int > > ( ) ;
3575
3567
}
3576
3568
3577
- public IEnumerable < T > GetNeighbors ( T vertex )
3569
+ public int GetNumVertices ( )
3578
3570
{
3579
- ValidateVertexArgument ( vertex ) ;
3580
- var idx = GetIndex ( vertex ) ;
3581
- var idxVertexMap = vertexIndexMap . ToDictionary ( x => x . Value , x => x . Key ) ;
3582
- foreach ( var neighbor in graph [ idx ] )
3583
- {
3584
- yield return idxVertexMap [ neighbor ] ;
3585
- }
3571
+ return graph . Count ;
3586
3572
}
3587
3573
3588
- public int GetNumNeighbors ( T vertex )
3574
+ public int GetNumNeighbors ( int vertex )
3589
3575
{
3590
- ValidateVertexArgument ( vertex ) ;
3591
- return graph [ GetIndex ( vertex ) ] . Count ;
3576
+ return GetNeighbors ( vertex ) . Count ( ) ;
3592
3577
}
3593
3578
3594
- public Digraph ( )
3579
+ public IEnumerable < int > GetNeighbors ( int vertex )
3595
3580
{
3596
- graph = new List < List < int > > ( ) ;
3597
- vertexIndexMap = new Dictionary < T , int > ( ) ;
3581
+ ValidateVertex ( vertex ) ;
3582
+ return graph [ vertex ] ;
3598
3583
}
3599
3584
3600
- public void AddVertex ( T vertex )
3585
+ public bool ContainsVertex ( int vertex )
3601
3586
{
3602
- if ( vertex == null )
3603
- {
3604
- throw new ArgumentNullException ( "vertex" ) ;
3605
- }
3606
-
3607
- if ( GetIndex ( vertex ) != - 1 )
3608
- {
3609
- throw new ArgumentException ( "Vertex already present! Cannot add it to the Digraph" , "vertex" ) ;
3610
- }
3587
+ return vertex >= 0 && vertex < graph . Count ;
3588
+ }
3611
3589
3612
- vertexIndexMap . Add ( vertex , graph . Count ) ;
3590
+ public void AddVertex ( )
3591
+ {
3613
3592
graph . Add ( new List < int > ( ) ) ;
3614
3593
}
3615
3594
3616
- public void AddEdge ( T fromVertex , T toVertex )
3595
+ public void AddEdge ( int fromVertex , int toVertex )
3617
3596
{
3618
- ValidateVertexArgument ( fromVertex ) ;
3619
- ValidateVertexArgument ( toVertex ) ;
3620
-
3621
- var toIdx = GetIndex ( toVertex ) ;
3622
- var fromVertexList = graph [ GetIndex ( fromVertex ) ] ;
3623
- if ( ! fromVertexList . Contains ( toIdx ) )
3597
+ ValidateVertex ( fromVertex ) ;
3598
+ ValidateVertex ( toVertex ) ;
3599
+ if ( graph [ fromVertex ] . Contains ( toVertex ) )
3624
3600
{
3625
- fromVertexList . Add ( toIdx ) ;
3601
+ throw new ArgumentException ( String . Format ( "Edge from {0} to {1} already present" , fromVertex , toVertex ) ) ;
3626
3602
}
3603
+ graph [ fromVertex ] . Add ( toVertex ) ;
3627
3604
}
3628
3605
3629
- public bool IsConnected ( T vertex1 , T vertex2 )
3606
+ public bool IsConnected ( int vertex1 , int vertex2 )
3630
3607
{
3631
- ValidateVertexArgument ( vertex1 ) ;
3632
- ValidateVertexArgument ( vertex2 ) ;
3608
+ ValidateVertex ( vertex1 ) ;
3609
+ ValidateVertex ( vertex2 ) ;
3633
3610
var visited = new bool [ graph . Count ] ;
3634
- return IsConnected ( GetIndex ( vertex1 ) , GetIndex ( vertex2 ) , ref visited ) ;
3611
+ return IsConnected ( vertex1 , vertex2 , ref visited ) ;
3635
3612
}
3636
3613
3637
3614
private bool IsConnected ( int fromIdx , int toIdx , ref bool [ ] visited )
@@ -3659,26 +3636,12 @@ private bool IsConnected(int fromIdx, int toIdx, ref bool[] visited)
3659
3636
return isConnected ;
3660
3637
}
3661
3638
3662
- private void ValidateNotNull ( T vertex )
3639
+ private void ValidateVertex ( int vertex )
3663
3640
{
3664
- if ( vertex == null )
3665
- {
3666
- throw new ArgumentNullException ( "vertex" ) ;
3667
- }
3668
- }
3669
-
3670
- private void ValidateVertexPresence ( T vertex )
3671
- {
3672
- if ( GetIndex ( vertex ) == - 1 )
3641
+ if ( ! ContainsVertex ( vertex ) )
3673
3642
{
3674
3643
throw new ArgumentOutOfRangeException ( "vertex not present in the Digraph." , "vertex" ) ;
3675
3644
}
3676
3645
}
3677
-
3678
- private void ValidateVertexArgument ( T vertex )
3679
- {
3680
- ValidateNotNull ( vertex ) ;
3681
- ValidateVertexPresence ( vertex ) ;
3682
- }
3683
3646
}
3684
3647
}
0 commit comments