Пример #1
0
        public static IBidirectionalGraph <TVertex, TEdge> CreateGeneralGraph <TVertex, TEdge>(
            int vertexCount,
            int edgeCount,
            int maxDegree,
            bool parallelEdgeAllowed,
            [NotNull, InstantHandle] Func <int, TVertex> vertexFactory,
            [NotNull, InstantHandle] Func <TVertex, TVertex, TEdge> edgeFactory,
            [NotNull] Random random)
            where TEdge : IEdge <TVertex>
        {
            var graph = new BidirectionalGraph <TVertex, TEdge>(parallelEdgeAllowed, vertexCount);

            var verticesMap = new Dictionary <int, TVertex>();

            for (int i = 0; i < vertexCount; ++i)
            {
                TVertex vertex = vertexFactory(i);
                verticesMap[i] = vertex;
                graph.AddVertex(vertex);
            }

            for (int i = 0; i < edgeCount; ++i)
            {
                int     childIndex;
                int     parentIndex;
                TVertex child;
                TVertex parent;
                do
                {
                    childIndex  = random.Next(vertexCount);
                    parentIndex = random.Next(vertexCount);
                    child       = verticesMap[childIndex];
                    parent      = verticesMap[parentIndex];
                } while (childIndex == parentIndex ||
                         !parallelEdgeAllowed && graph.ContainsEdge(parent, child) ||
                         graph.Degree(parent) >= maxDegree ||
                         graph.Degree(child) >= maxDegree);

                // Create the edge between the 2 vertex
                graph.AddEdge(edgeFactory(parent, child));
            }

            return(graph);
        }
Пример #2
0
        public static IBidirectionalGraph <TVertex, TEdge> CreateGeneralGraph <TVertex, TEdge>(int vertexCount, int edgeCount, int maxDegree, bool parallelEdgeAllowed, Func <int, TVertex> vertexFactory, Func <TVertex, TVertex, TEdge> edgeFactory)
            where TEdge : IEdge <TVertex>
        {
            BidirectionalGraph <TVertex, TEdge> graph = new BidirectionalGraph <TVertex, TEdge>(false, vertexCount);

            Dictionary <int, TVertex> vertexMap = new Dictionary <int, TVertex>();

            for (int i = 0; i < vertexCount; i++)
            {
                TVertex v = vertexFactory(i);
                vertexMap[i] = v;
                graph.AddVertex(v);
            }

            Random  rnd = new Random(DateTime.Now.Millisecond);
            int     childIndex;
            int     parentIndex;
            TVertex child;
            TVertex parent;

            for (int i = 0; i < edgeCount; i++)
            {
                do
                {
                    childIndex  = rnd.Next(vertexCount);
                    parentIndex = rnd.Next(vertexCount);
                    child       = vertexMap[childIndex];
                    parent      = vertexMap[parentIndex];
                }while (childIndex == parentIndex ||
                        (!parallelEdgeAllowed && graph.ContainsEdge(parent, child)) ||
                        graph.Degree(parent) >= maxDegree ||
                        graph.Degree(child) >= maxDegree);

                //create the edge between the 2 vertex
                TEdge e = edgeFactory(parent, child);
                graph.AddEdge(e);
            }

            return(graph);
        }
Пример #3
0
 public int Degree(TVertex v) => _graph.Degree(v);