22// Created by barto on 19.05.18.
33//
44
5+ #include < cmath>
6+ #include < random>
57#include " DirectedGraph.h"
68
79using namespace std ;
@@ -19,6 +21,55 @@ std::string DirectedGraph::getAvailableAlgorithms() {
1921}
2022
2123void DirectedGraph::generate (int numberOfVertices, int density) {
24+ double dens = (double )density / 100 ;
25+ dens *= numberOfVertices * (numberOfVertices - 1 );
26+ int numberOfEdges = round (dens);
27+
28+ // prepare matrix and list
29+ incidenceMatrix.clear ();
30+ adjacencyList.clear ();
31+
32+ incidenceMatrix.resize (numberOfEdges);
33+ adjacencyList.resize (numberOfVertices);
34+
35+ for (auto & row : incidenceMatrix) {
36+ row.assign (numberOfVertices, 0 );
37+ }
38+
39+ // declare rands
40+ std::random_device rd;
41+ std::mt19937 mt (rd ());
42+ std::uniform_int_distribution<int > randomVertex (0 , numberOfVertices);
43+ std::uniform_int_distribution<int > randomEdge (0 , numberOfEdges);
44+ std::uniform_int_distribution<int > randomValue (INT32_MIN, INT32_MAX);
45+
46+ int beginningVertex = 0 ;
47+ int endVertex = 0 ;
48+ int value;
49+ bool edgeBeginningNotAvailable = true ;
50+ bool edgeEndNotAvailable = true ;
51+
52+ // generate rand edges
53+ for (int i = 0 ; i < numberOfEdges; i++) {
54+ // random beggining
55+ edgeBeginningNotAvailable = true ;
56+ while (edgeBeginningNotAvailable){
57+ beginningVertex = randomVertex (mt);
58+ edgeBeginningNotAvailable = !edgeBeginningAvailable (beginningVertex);
59+ };
60+ // random end
61+ edgeEndNotAvailable = true ;
62+ while (edgeEndNotAvailable){
63+ endVertex = randomVertex (mt);
64+ edgeEndNotAvailable = !edgeEndAvailable (beginningVertex, endVertex);
65+ };
66+
67+ value = randomValue (mt);
68+
69+ adjacencyList[beginningVertex].push_front ({endVertex, value});
70+ incidenceMatrix[i][beginningVertex] = value;
71+ incidenceMatrix[i][endVertex] = -1 * value;
72+ }
2273
2374}
2475
0 commit comments