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

Commit f3adce4

Browse files
committed
Merge branch 'generate-graphs' into development
2 parents c1935e7 + 6fe3368 commit f3adce4

5 files changed

Lines changed: 129 additions & 1 deletion

File tree

DirectedGraph.cpp

Lines changed: 52 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,56 @@ 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 - 1);
43+
// std::uniform_int_distribution<int> randomEdge(0, numberOfEdges - 1);
44+
// std::uniform_int_distribution<int> randomValue(1, 15);
45+
std::uniform_int_distribution<int> randomValue(1, INT32_MAX);
46+
47+
int beginningVertex = 0;
48+
int endVertex = 0;
49+
int value;
50+
bool edgeBeginningNotAvailable = true;
51+
bool edgeEndNotAvailable = true;
52+
53+
// generate rand edges
54+
for (int i = 0; i < numberOfEdges; i++) {
55+
// random beggining
56+
edgeBeginningNotAvailable = true;
57+
while (edgeBeginningNotAvailable){
58+
beginningVertex = randomVertex(mt);
59+
edgeBeginningNotAvailable = !edgeBeginningAvailable(beginningVertex);
60+
};
61+
// random end
62+
edgeEndNotAvailable = true;
63+
while (edgeEndNotAvailable){
64+
endVertex = randomVertex(mt);
65+
edgeEndNotAvailable = !edgeEndAvailable(beginningVertex, endVertex);
66+
};
67+
68+
value = randomValue(mt);
69+
70+
adjacencyList[beginningVertex].push_front({endVertex, value});
71+
incidenceMatrix[i][beginningVertex] = value;
72+
incidenceMatrix[i][endVertex] = -1 * value;
73+
}
2274

2375
}
2476

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

UndirectedGraph.cpp

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

5+
#include <random>
56
#include "UndirectedGraph.h"
67

78
using namespace std;
@@ -19,7 +20,58 @@ std::string UndirectedGraph::getAvailableAlgorithms() {
1920
}
2021

2122
void UndirectedGraph::generate(int numberOfVertices, int density) {
23+
double dens = (double)density / 100;
24+
dens *= numberOfVertices * (numberOfVertices - 1);
25+
dens /= 2;
26+
int numberOfEdges = round(dens);
2227

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 - 1);
43+
// std::uniform_int_distribution<int> randomEdge(0, numberOfEdges - 1);
44+
// std::uniform_int_distribution<int> randomValue(1, 15);
45+
std::uniform_int_distribution<int> randomValue(1, INT32_MAX);
46+
47+
int beginningVertex = 0;
48+
int endVertex = 0;
49+
int value;
50+
bool edgeBeginningNotAvailable = true;
51+
bool edgeEndNotAvailable = true;
52+
53+
// generate rand edges
54+
for (int i = 0; i < numberOfEdges; i++) {
55+
// random beggining
56+
edgeBeginningNotAvailable = true;
57+
while (edgeBeginningNotAvailable) {
58+
beginningVertex = randomVertex(mt);
59+
edgeBeginningNotAvailable = !edgeBeginningAvailable(beginningVertex);
60+
};
61+
// random end
62+
edgeEndNotAvailable = true;
63+
while (edgeEndNotAvailable) {
64+
endVertex = randomVertex(mt);
65+
edgeEndNotAvailable = !edgeEndAvailable(beginningVertex, endVertex);
66+
};
67+
68+
value = randomValue(mt);
69+
70+
adjacencyList[beginningVertex].push_front({endVertex, value});
71+
adjacencyList[endVertex].push_front({beginningVertex, value});
72+
incidenceMatrix[i][beginningVertex] = value;
73+
incidenceMatrix[i][endVertex] = value;
74+
}
2375
}
2476

2577
void UndirectedGraph::runAlgorithm(int index, int arg1, int arg2) {

0 commit comments

Comments
 (0)