-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGraph.h
More file actions
142 lines (124 loc) · 3.02 KB
/
Graph.h
File metadata and controls
142 lines (124 loc) · 3.02 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
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
* Copyright 2018
*
* Fișier header cu definiția clasei graf.
*/
#ifndef GRAPH_H_
#define GRAPH_H_
// Biblioteci
#include <vector>
// Declarări using
using std::vector;
/**
* Structura unui nod
*/
template <typename T>
struct Node {
// Lista de vecini
vector<int> neighbors;
// Data generică reținută în nod
T data;
// Gradul interior al nodului
int intern = 0;
};
/**
* Graf orientat, implementat utilizând liste de adiacență.
*
* Implementare generică.
*/
template <typename T>
class Graph {
private:
// Listele de vecini
vector< Node<T> > nodes;
// Numărul de noduri din graf
int size = 0;
// Iteratorul prin listele de vecini
typename vector<int>::iterator it;
public:
// Numărul de componente conexe din graf
int numConnectedComponents = 0;
// Constructor
Graph(int size, T data[]) {
this->size = size;
nodes.resize(size);
for (int i = 0; i < size; ++i) {
nodes[i].neighbors.resize(0);
nodes[i].data = data[i];
}
}
// Destructor
~Graph() {
}
/**
* Adaugă o muchie între noduri.
*
* @param src - Nodul sursă al muchiei.
* @param dst - Vârful muchiei.
*
* Parametrii au aceeași semnificație și în funcțiile următoare.
*/
void addEdge(int src, int dst) {
nodes[src].neighbors.push_back(dst);
++nodes[dst].intern;
}
/**
* Elimină o muchie din graf, dacă aceasta există.
*/
void removeEdge(int src, int dst) {
for (it = nodes[src].neighbors.begin();
it != nodes[src].neighbors.end();
/* Incrementare în for */) {
if (*it == dst) {
nodes[src].neighbors.erase(it);
}
else
++it;
}
--nodes[dst].intern;
}
/**
* Verică dacă există o muchie între două noduri.
*
* @returnează adevărat dacă exsistă o muchie de la src la dst,
* fals în caz contrar.
*/
bool hasEdge(int src, int dst) {
for (it = nodes[src].neighbors.begin();
it != nodes[src].neighbors.end();
++it) {
if (*it == dst)
return true;
}
return false;
}
/**
* Întoarce lista de vecini a unui nod.
*
* @param node - Nodul ai cărui vecini vor fi returnați.
* @returnează un vector ce conține vecinii.
*/
vector<int> getNeighbors(int node) {
return nodes[node].neighbors;
}
/**
* Întoarce mărimea grafului, adică numărul de noduri din el.
*/
int getSize() {
return size;
}
/**
* Întoarce gradul interior al unui nod, adică numărul de muchii
* spre acesta.
*/
int trafficIntensity(int node) {
return nodes[node].intern;
}
/**
* Funcție de schimbare a datelor dintr-un nod.
*/
void changeData(int node, T data) {
nodes[node].data = data;
}
};
#endif // GRAPH_H_