-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGrafo
More file actions
151 lines (122 loc) · 4.15 KB
/
Grafo
File metadata and controls
151 lines (122 loc) · 4.15 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
143
144
145
146
147
148
149
150
151
#include <iostream>
#include <vector>
using namespace std;
template <typename edgeValueType>
class Grafo {
private:
struct Pair {
int key;
edgeValueType value;
Pair() : key(int()), value(edgeValueType()) {}
Pair(const int& key, const edgeValueType& value) : key(key), value(value) {}
void setValue(const edgeValueType& newValue) {
value = newValue;
}
};
bool isDirected;
int numVertices;
vector<vector<Pair>> listaAdyacencia;
void auxDFS(int vertice, vector<bool>& visitado) {
visitado[vertice] = true;
cout << vertice << " ";
for (Pair vecino : listaAdyacencia[vertice]) {
if (!visitado[vecino.key]) {
auxDFS(vecino.key, visitado);
}
}
}
void auxBFS(int vertice, vector<bool>& visitado, vector<int>& nivelActual) {
// Procesar los nodos del nivel actual
if (nivelActual.empty()) return;
vector<int> siguienteNivel; // Almacena los nodos del siguiente nivel
for (int nodo : nivelActual) {
cout << nodo << " "; // Imprimir nodo visitado
for (Pair vecino : listaAdyacencia[nodo]) {
if (!visitado[vecino.key]) {
visitado[vecino.key] = true;
siguienteNivel.push_back(vecino.key); // Añadir vecino al siguiente nivel
}
}
}
// Llamada recursiva para procesar el siguiente nivel
auxBFS(vertice, visitado, siguienteNivel);
}
public:
Grafo(int vertices, bool dirigido = false) {
numVertices = vertices;
isDirected = dirigido;
listaAdyacencia.resize(numVertices);
}
void agregarArista(int origen, int destino, edgeValueType value) {
if(origen < 0 || origen >= numVertices || destino < 0 || destino >= numVertices) {
cout << "Error: Vertices fuera de rango" << endl;
return;
}
if(isDirected){ // Dirigido
listaAdyacencia[origen].push_back(Pair(destino, value));
return;
} else { // No dirigido
listaAdyacencia[origen].push_back(Pair(destino, value));
listaAdyacencia[destino].push_back(Pair(origen, value));
}
}
void DFS(int inicio) {
vector<bool> visitado(numVertices, false);
auxDFS(inicio, visitado);
}
void BFS(int inicio) {
vector<bool> visitado(numVertices, false);
vector<int> nivelActual; // Nodo inicial como el nivel actual
nivelActual.push_back(inicio);
visitado[inicio] = true;
auxBFS(inicio, visitado, nivelActual);
}
int contarComponentesConexas() {
vector<bool> visitado(numVertices, false);
int componentes = 0;
for (int i = 0; i < numVertices; i++) {
if (!visitado[i]) {
componentes++;
auxDFS(i, visitado); // Realiza DFS desde este nodo no visitado
}
}
return componentes;
}
int contarComponentesConexasBFS() {
vector<bool> visitado(numVertices, false);
int componentes = 0;
for (int i = 0; i < numVertices; i++) {
if (!visitado[i]) {
componentes++;
vector<int> nivelActual = {i}; // Inicia desde un nodo no visitado
visitado[i] = true;
auxBFS(i, visitado, nivelActual); // Llamar al BFS recursivo
}
}
return componentes;
}
void imprimirGrafo() {
for (int i = 0; i < numVertices; i++) {
cout << "Vertice " << i << ":";
for (Pair arista : listaAdyacencia[i]) {
cout << " -> " << arista.key << ":("<< arista.value << ")";
}
cout << endl;
}
}
};
int main() {
int vertices = 6;
Grafo<float> grafo(vertices, true);
grafo.agregarArista(0, 5,1);
grafo.agregarArista(1, 0,1);
grafo.agregarArista(1, 2,1);
grafo.agregarArista(1, 3,1);
grafo.agregarArista(3, 2,1);
grafo.agregarArista(2, 4,1);
grafo.agregarArista(4, 5,1);
grafo.imprimirGrafo();
grafo.DFS(0);
grafo.DFS(1);
return 0;
}