-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAdjacencyMatrixGraph.cpp
123 lines (104 loc) · 3.19 KB
/
AdjacencyMatrixGraph.cpp
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "DynamicList.h"
#include "DynamicArray.h"
#include "adjacencyMatrixGraph.h"
#include "ProgramFlowStaticFunction.h"
#include <iostream>
#include <fstream>
namespace AlgoGraph
{
AdjacencyMatrixGraph::AdjacencyMatrixGraph(int i_NumberOfVertex)
{
m_NumberOfVertices = i_NumberOfVertex;
MakeEmptyGraph(i_NumberOfVertex);
}
void AdjacencyMatrixGraph::MakeEmptyGraph(int i_NumberOfVertex)
{
m_NumberOfVertices = i_NumberOfVertex;
int size = i_NumberOfVertex+1;
m_AdjancencyMatrix = new GraphEdge* [size];
for (int i = 0; i < size; i++)
{
m_AdjancencyMatrix[i] = new GraphEdge[size];
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
m_AdjancencyMatrix[i][j].SetInfinityWeight();
m_AdjancencyMatrix[i][j].SetOutVertex(i);
m_AdjancencyMatrix[i][j].SetInVertex(j);
}
}
}
void AdjacencyMatrixGraph::IsSelfLoop(int i_OutVertex, int i_InVertex)
{
if (i_OutVertex==i_InVertex)
PrintWrongInput();
}
DynamicList<GraphEdge> AdjacencyMatrixGraph::GetAdjList(int i_OutVertex)
{
DynamicList<GraphEdge> adjacentVerticiesList;
for (int i = 1; i <= m_NumberOfVertices; i++)
{
if (isAdjacent(i_OutVertex, i))
{
GraphEdge edgeToBeAdded = m_AdjancencyMatrix[i_OutVertex][i];
adjacentVerticiesList.AddItemToTail(edgeToBeAdded);
}
}
return adjacentVerticiesList;
}
void AdjacencyMatrixGraph::IsEdgeInRange(int i_OutVertex, int i_InVertex)
{
if (i_OutVertex > m_NumberOfVertices || i_InVertex > m_NumberOfVertices || i_OutVertex < 1 || i_InVertex < 1)
PrintWrongInput();
}
AdjacencyMatrixGraph::~AdjacencyMatrixGraph()
{
for (int i = 0; i < m_NumberOfVertices; i++)
{
delete[] m_AdjancencyMatrix[i];
}
delete[] m_AdjancencyMatrix;
}
AdjacencyMatrixGraph::AdjacencyMatrixGraph(string i_InputFileName, int i_NumberOfVertex,int i_fileIndentation,int amountOfEdges)
{
ifstream inputFile;
inputFile.open(i_InputFileName);
inputFile.seekg(i_fileIndentation, inputFile.beg);
MakeEmptyGraph(i_NumberOfVertex);
inputFile.seekg(i_fileIndentation, inputFile.beg);
int inVertex;
int outVertex;
float weightOfEdge;
for(int i=0;i<amountOfEdges;i++)
{
inputFile >> outVertex >> inVertex >> weightOfEdge;
AddEdgeToGraph(outVertex, inVertex, weightOfEdge);
}
inputFile.close();
}
void AdjacencyMatrixGraph::AddEdgeToGraph(int i_OutVertex, int i_InVertex, float i_WeightOfEdge)
{
IsEdgeInRange(i_OutVertex, i_InVertex);
IsSelfLoop(i_OutVertex, i_InVertex);
if (i_WeightOfEdge < 0)
PrintWrongInput();
if (m_AdjancencyMatrix[i_OutVertex][i_InVertex].IsWeightInfinity())
{
m_AdjancencyMatrix[i_OutVertex][i_InVertex].SetEdgeWeight(i_WeightOfEdge);
}
else //if is not true means edge is not infinity => edge already exist
PrintWrongInput();
}
void AdjacencyMatrixGraph::RemoveEdgeFromGraph(int i_OutVertex, int i_InVertex)
{
IsEdgeInRange(i_OutVertex, i_InVertex);
m_AdjancencyMatrix[i_OutVertex][i_InVertex].SetInfinityWeight();
}
bool AdjacencyMatrixGraph::isAdjacent(int i_OutVertex, int i_InVertex)
{
IsEdgeInRange(i_OutVertex, i_InVertex);
return !(m_AdjancencyMatrix[i_OutVertex][i_InVertex].IsWeightInfinity()); //IsWeightInfinity() returns true if infinity meaning not adjacent
}
}