public bool HasDirectedCycle() { DirectedGraph tempGraph = (DirectedGraph)this.Clone(); tempGraph.ComputeStronglyConnectedComponents(null); IEnumerable <GraphNode> query = (from node1 in tempGraph.Nodes from node2 in tempGraph.Nodes where ((!node1.Name.Equals(node2.Name)) && node1.ComponentNumber == node2.ComponentNumber) select node1); return(query != null && query.Count() > 0); }
public bool AdditionalEdgeInducesDirectedCycle(DirectedGraphEdge additionalEdge) { DirectedGraph tempGraph = (DirectedGraph)this.Clone(); tempGraph.AddEdge(additionalEdge); tempGraph.ComputeStronglyConnectedComponents(null); List <GraphNode> query = (from node1 in tempGraph.Nodes from node2 in tempGraph.Nodes where ((!node1.Name.Equals(node2.Name)) && node1.ComponentNumber == node2.ComponentNumber) select node1).ToList(); return(query != null && query.Count() > 0); }
public bool EdgeReversalInducesDirectedCycle(DirectedGraphEdge edge) { DirectedGraph tempGraph = (DirectedGraph)this.Clone(); tempGraph.RemoveEdge(edge.From, edge.To); tempGraph.AddEdge(new DirectedGraphEdge(edge.To, edge.From, edge.Cost)); tempGraph.ComputeStronglyConnectedComponents(null); List <GraphNode> query = (from node1 in tempGraph.Nodes from node2 in tempGraph.Nodes where ((!node1.Name.Equals(node2.Name)) && node1.ComponentNumber == node2.ComponentNumber) select node1).ToList(); return(query != null && query.Count() > 0); }