Example #1
0
        public void LinearTwoLines()
        {
            var graph = new List <Vertex <string> >();
            var vA    = new Vertex <string>("A");
            var vB    = new Vertex <string>("B");
            var vC    = new Vertex <string>("C");
            var vD    = new Vertex <string>("D");

            vB.Dependencies.Add(vD);
            vD.Dependencies.Add(vC);
            vA.Dependencies.Add(vB);
            vB.Dependencies.Add(vC);
            graph.Add(vA);
            graph.Add(vB);
            graph.Add(vC);

            var detector = new StronglyConnectedComponentFinder <string>();
            StronglyConnectedComponentList <string> components = detector.DetectCycle(graph);

            Assert.AreEqual(4, components.Count);
            Assert.AreEqual(4, components.IndependentComponents().Count());
            Assert.AreEqual(0, components.Cycles().Count());
            Assert.AreEqual("C", components.First().First().Value);
            Assert.AreEqual("D", components.Skip(1).First().First().Value);
            Assert.AreEqual("B", components.Skip(2).First().First().Value);
            Assert.AreEqual("A", components.Skip(3).First().First().Value);
        }
Example #2
0
 /// <summary>
 /// Calculates the sets of strongly connected vertices.
 /// </summary>
 /// <param name="graph">Graph to detect cycles within.</param>
 /// <returns>Set of strongly connected components (sets of vertices)</returns>
 public StronglyConnectedComponentList <T> DetectCycle(IEnumerable <Vertex <T> > graph)
 {
     stronglyConnectedComponents = new StronglyConnectedComponentList <T>();
     index = 0;
     stack = new Stack <Vertex <T> >();
     foreach (var v in graph)
     {
         if (v.Index < 0)
         {
             StrongConnect(v);
         }
     }
     return(stronglyConnectedComponents);
 }