Exemple #1
0
        /// <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);
        }
Exemple #6
0
		/// <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();
		}