-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrandomizer.cpp
More file actions
70 lines (60 loc) · 1.94 KB
/
randomizer.cpp
File metadata and controls
70 lines (60 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "randomizer.h"
#include <cstdlib>
#include <ctime>
bool Randomizer::singleRandomization(Graph *graph)
{
srand(time(NULL));
std::vector<Connection>connectionList=graph->getConnectionList();
if(connectionList.size()<2){
return false;
}
Connection connection=connectionList[std::rand()%connectionList.size()];
std::vector<int> firstUnconnected;
std::vector<int> secondUnconnected;
bool ** matrix=graph->getAdjacencyMatrix();
for(int i=0;i<graph->getVerticesNumber();i++){
if(i!=connection.firstID && matrix[i][connection.firstID]==0){
firstUnconnected.push_back(i);
}
if(i!=connection.secondID && matrix[i][connection.secondID]==0){
secondUnconnected.push_back(i);
}
}
std::vector<Connection> candidates;
for(int i=0;i<firstUnconnected.size();i++){
for(int j=0;j<secondUnconnected.size();j++){
if(matrix[firstUnconnected[i]][secondUnconnected[j]]==1){
Connection pair={firstUnconnected[i],secondUnconnected[j]};
candidates.push_back(pair);
}
}
}
if(candidates.size()==0){
return false;
}
Connection choosedConnection=candidates[std::rand()%candidates.size()];
graph->disconnectVertices(connection.firstID,connection.secondID);
graph->disconnectVertices(choosedConnection.firstID,choosedConnection.secondID);
graph->connectVertices(connection.firstID,choosedConnection.firstID);
graph->connectVertices(connection.secondID,choosedConnection.secondID);
return true;
}
bool Randomizer::Randomize(Graph *graph, int times){
int counter=0;
for(int i=0;i<times;i++){
if(!Randomizer::singleRandomization(graph)){
i--;
}
else{
counter=0;
}
if(counter>10000){
break;
}
counter++;
}
if(counter>10000){
return false;
}
return true;
}