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); }
/// <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); }