Skip to content
This repository was archived by the owner on May 27, 2019. It is now read-only.

Commit 52d2f7c

Browse files
committed
Add method for generating edges
It's still broken and segfaults
1 parent 0f641c1 commit 52d2f7c

4 files changed

Lines changed: 76 additions & 1 deletion

File tree

DirectedGraph.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Created by barto on 19.05.18.
33
//
44

5+
#include <cmath>
6+
#include <random>
57
#include "DirectedGraph.h"
68

79
using namespace std;
@@ -19,6 +21,55 @@ std::string DirectedGraph::getAvailableAlgorithms() {
1921
}
2022

2123
void 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

DirectedGraph.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ class DirectedGraph : public Graph {
2323
protected:
2424
void loadRawDataToMatrix(std::vector<int> rawData) override ;
2525
void loadRawDataToList(std::vector<int> rawData) override ;
26-
2726
};
2827

2928

Graph.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,25 @@ vector<int> Graph::loadRawDataFrom(string path) {
151151

152152
return returnIntVector;
153153
}
154+
155+
bool Graph::edgeBeginningAvailable(int vertex) {
156+
int i = 0;
157+
for (auto& v : adjacencyList[vertex]) {
158+
i++;
159+
}
160+
161+
if (i < (adjacencyList.size() - 1)) return true;
162+
return false;
163+
}
164+
165+
bool Graph::edgeEndAvailable(int beginning, int end) {
166+
if (beginning == end) {
167+
return false;
168+
}
169+
170+
for (auto& v : adjacencyList[beginning]) {
171+
if (v.edgeEnd == end)
172+
return false;
173+
}
174+
return true;
175+
}

Graph.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class Graph {
5656
virtual void loadRawDataToMatrix(std::vector<int> rawData)= 0;
5757
virtual void loadRawDataToList(std::vector<int> rawData)= 0;
5858

59+
bool edgeBeginningAvailable(int vertex);
60+
bool edgeEndAvailable(int beginning, int end);
61+
5962
};
6063

6164

0 commit comments

Comments
 (0)