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); }
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); }
public int Degree(TVertex v) => _graph.Degree(v);