public void RemoveDanglingLinks()
 {
     VertexCollection vertexs = new VertexCollection();
     do
     {
         vertexs.Clear();
         IVertexListGraph graph = new FilteredVertexListGraph(this.VisitedGraph, new InDictionaryVertexPredicate(this.ranks));
         foreach (IVertex vertex in this.ranks.get_Keys())
         {
             if (graph.OutDegree(vertex) == 0)
             {
                 vertexs.Add(vertex);
             }
         }
         VertexCollection.Enumerator enumerator = vertexs.GetEnumerator();
         while (enumerator.MoveNext())
         {
             IVertex vertex2 = enumerator.get_Current();
             this.ranks.Remove(vertex2);
         }
     }
     while (vertexs.Count != 0);
 }
 public void Create(IMutableVertexAndEdgeListGraph cg)
 {
     if (cg == null)
     {
         throw new ArgumentNullException("cg");
     }
     if (this.components == null)
     {
         this.ComputeComponents();
     }
     this.sccVertexMap = this.BuildSCCVertexMap(this.components);
     VertexCollection vertexs = new VertexCollection();
     IDictionaryEnumerator enumerator = this.sccVertexMap.GetEnumerator();
     while (enumerator.MoveNext())
     {
         IVertex cgVertex = cg.AddVertex();
         this.OnInitCondensationGraphVertex(new CondensationGraphVertexEventArgs(cgVertex, (IVertexCollection) enumerator.Value));
         vertexs.Add(cgVertex);
     }
     for (int i = 0; i < this.sccVertexMap.Keys.Count; i++)
     {
         VertexCollection vertexs2 = new VertexCollection();
         IVertexEnumerator enumerator2 = ((IVertexCollection) this.sccVertexMap[i]).GetEnumerator();
         while (enumerator2.MoveNext())
         {
             IVertex vertex2 = enumerator2.get_Current();
             IEdgeEnumerator enumerator3 = this.VisitedGraph.OutEdges(vertex2).GetEnumerator();
             while (enumerator3.MoveNext())
             {
                 IVertex vertex3 = enumerator3.get_Current().get_Target();
                 int num2 = this.components.get_Item(vertex3);
                 if (i != num2)
                 {
                     IVertex vertex4 = vertexs.get_Item(num2);
                     if (!vertexs2.Contains(vertex4))
                     {
                         vertexs2.Add(vertex4);
                     }
                 }
             }
         }
         IVertex vertex5 = vertexs.get_Item(i);
         VertexCollection.Enumerator enumerator4 = vertexs2.GetEnumerator();
         while (enumerator4.MoveNext())
         {
             IVertex vertex6 = enumerator4.get_Current();
             cg.AddEdge(vertex5, vertex6);
         }
     }
 }
 internal void ComputeNoInit(IVertex s)
 {
     VertexCollection vertices = new VertexCollection();
     new TopologicalSortAlgorithm(this.VisitedGraph, vertices).Compute();
     this.OnDiscoverVertex(s);
     VertexCollection.Enumerator enumerator = vertices.GetEnumerator();
     while (enumerator.MoveNext())
     {
         IVertex v = enumerator.get_Current();
         this.OnExamineVertex(v);
         IEdgeEnumerator enumerator2 = this.VisitedGraph.OutEdges(v).GetEnumerator();
         while (enumerator2.MoveNext())
         {
             IEdge e = enumerator2.get_Current();
             this.OnDiscoverVertex(e.get_Target());
             if (this.Relax(e))
             {
                 this.OnEdgeRelaxed(e);
             }
             else
             {
                 this.OnEdgeNotRelaxed(e);
             }
         }
         this.OnFinishVertex(v);
     }
 }