/// <summary> /// Computes the connected components. /// </summary> /// <param name="g">graph to explore</param> /// <param name="components">component map where results are recorded</param> /// <returns>number of components</returns> public static int ConnectedComponents( IVertexListGraph g, VertexIntDictionary components) { ConnectedComponentsAlgorithm conn = new ConnectedComponentsAlgorithm(g, components); return(conn.Compute()); }
/// <summary> /// Computes the connected components of a graph /// </summary> /// <typeparam name="TVertex">type of the vertices</typeparam> /// <typeparam name="TEdge">type of the edges</typeparam> /// <param name="g"></param> /// <param name="components"></param> /// <returns>number of components</returns> public static int ConnectedComponents <TVertex, TEdge> (this IUndirectedGraph <TVertex, TEdge> g, IDictionary <TVertex, int> components) where TEdge : IEdge <TVertex> { Contract.Requires(g != null); Contract.Requires(components != null); var conn = new ConnectedComponentsAlgorithm <TVertex, TEdge>(g, components); conn.Compute(); return(conn.ComponentCount); }
public static int ConnectedComponents <TVertex, TEdge>( IUndirectedGraph <TVertex, TEdge> g, TVertex startVertex, IDictionary <TVertex, int> components) where TEdge : IEdge <TVertex> { GraphContracts.AssumeNotNull(g, "g"); GraphContracts.Assume(g.ContainsVertex(startVertex), "g.ContainsVertex(startVertex)"); GraphContracts.AssumeNotNull(components, "components"); var conn = new ConnectedComponentsAlgorithm <TVertex, TEdge>(g, components); conn.Compute(startVertex); return(conn.ComponentCount); }
public bool isEulerian() { var componentsAlgo = new ConnectedComponentsAlgorithm <TVertex, UndirectedEdge <TVertex> >(this.graph); componentsAlgo.Compute(); // Only one component could contain edges bool[] hasEdgesInComponent = new bool[componentsAlgo.ComponentCount]; foreach (var verticeAndComponent in componentsAlgo.Components) { hasEdgesInComponent[verticeAndComponent.Value] = graph.AdjacentEdges(verticeAndComponent.Key).Count() > 0; } var t = firstAndSecondIndexOfTrue(hasEdgesInComponent); int?firstIndex = t.Item1, secondIndex = t.Item2; // No edges at all or More than one component contain edges if (!firstIndex.HasValue || secondIndex.HasValue) { return(false); } else { // Now only one component contains edges, check is it an eulerian component // If component contain one vertex it is an eulerian component if (componentsAlgo.Components.First(x => x.Value == firstIndex.Value).Key .Equals(componentsAlgo.Components.Last(x => x.Value == firstIndex.Value).Key)) { return(true); } foreach (var verticeAndComponent in componentsAlgo.Components) { // Vertice in selected component and has even count of edges if (verticeAndComponent.Value == firstIndex.Value && graph.AdjacentEdges(verticeAndComponent.Key).Count() % 2 == 1) { return(false); } } return(true); } }
public ComponentWithEdges checkComponentsWithEdges() { var componentsAlgo = new ConnectedComponentsAlgorithm <TVertex, UndirectedEdge <TVertex> >(this.graph); componentsAlgo.Compute(); bool[] hasEdgesInComponent = new bool[componentsAlgo.ComponentCount]; foreach (var verticeAndComponent in componentsAlgo.Components) { hasEdgesInComponent[verticeAndComponent.Value] = !graph.IsAdjacentEdgesEmpty(verticeAndComponent.Key); } var t = firstAndSecondIndexOfTrue(hasEdgesInComponent); int?firstIndex = t.Item1, secondIndex = t.Item2; if (!firstIndex.HasValue) { return(ComponentWithEdges.NoComponent); } if (secondIndex.HasValue) { return(ComponentWithEdges.ManyComponents); } return(ComponentWithEdges.OneComponent); }
/// <summary> /// Computes the connected components. /// </summary> /// <param name="g">graph to explore</param> /// <param name="components">component map where results are recorded</param> /// <returns>number of components</returns> public static int ConnectedComponents( IVertexListGraph g, VertexIntDictionary components) { ConnectedComponentsAlgorithm conn = new ConnectedComponentsAlgorithm(g,components); return conn.Compute(); }