Esempio n. 1
0
		/// <summary>
		/// Divides the supplied graph to its connected subgraphs.
		/// </summary>
		public static IGraph[] Split(IGraph initial, IGraphBuilder builder)
		{
			// A list with the nodes awaiting to be processed
			NodeCollection nodes = initial.Nodes.Clone() as NodeCollection;

			// A list with the subgraphs
			IGraph subgraph = null;
			ArrayList subgraphs = new ArrayList();

			while (nodes.Count > 0)
			{
				INode node = nodes[0];
				nodes.RemoveAt(0);

				subgraph = builder.Create();
				subgraph.Nodes.Add(node);

				int i = 0;
				while (i < subgraph.Nodes.Count)
				{
					node = subgraph.Nodes[i];

					foreach (ILink link in node.InLinks)
					{
						if (!subgraph.Nodes.Contains(link.Origin))
						{
							subgraph.Nodes.Add(link.Origin);
							nodes.Remove(link.Origin);
						}

						if (!subgraph.Links.Contains(link))
							subgraph.Links.Add(link);
					}

					foreach (ILink link in node.OutLinks)
					{
						if (!subgraph.Nodes.Contains(link.Destination))
						{
							subgraph.Nodes.Add(link.Destination);
							nodes.Remove(link.Destination);
						}

						if (!subgraph.Links.Contains(link))
							subgraph.Links.Add(link);
					}

					i++;
				}

				subgraphs.Add(subgraph);
			}

			IGraph[] result = new IGraph[subgraphs.Count];
			for (int i = 0; i < subgraphs.Count; i++)
				result[i] = subgraphs[i] as IGraph;

			return result;
		}
Esempio n. 2
0
        /// <summary>
        /// Divides the supplied graph to its connected subgraphs.
        /// </summary>
        public static IGraph[] Split(IGraph initial, IGraphBuilder builder)
        {
            // A list with the nodes awaiting to be processed
            NodeCollection nodes = initial.Nodes.Clone() as NodeCollection;

            // A list with the subgraphs
            IGraph    subgraph  = null;
            ArrayList subgraphs = new ArrayList();

            while (nodes.Count > 0)
            {
                INode node = nodes[0];
                nodes.RemoveAt(0);

                subgraph = builder.Create();
                subgraph.Nodes.Add(node);

                int i = 0;
                while (i < subgraph.Nodes.Count)
                {
                    node = subgraph.Nodes[i];

                    foreach (ILink link in node.InLinks)
                    {
                        if (!subgraph.Nodes.Contains(link.Origin))
                        {
                            subgraph.Nodes.Add(link.Origin);
                            nodes.Remove(link.Origin);
                        }

                        if (!subgraph.Links.Contains(link))
                        {
                            subgraph.Links.Add(link);
                        }
                    }

                    foreach (ILink link in node.OutLinks)
                    {
                        if (!subgraph.Nodes.Contains(link.Destination))
                        {
                            subgraph.Nodes.Add(link.Destination);
                            nodes.Remove(link.Destination);
                        }

                        if (!subgraph.Links.Contains(link))
                        {
                            subgraph.Links.Add(link);
                        }
                    }

                    i++;
                }

                subgraphs.Add(subgraph);
            }

            IGraph[] result = new IGraph[subgraphs.Count];
            for (int i = 0; i < subgraphs.Count; i++)
            {
                result[i] = subgraphs[i] as IGraph;
            }

            return(result);
        }