Una lista de adyacencia es una estructura de datos utilizada para representar un grafo en una computadora. Un grafo es un conjunto de vértices (también conocidos como nodos) y arcos (también conocidos como aristas) que conectan a los vértices entre sí.
La lista de adyacencia es una forma de representar un grafo en una computadora utilizando una lista enlazada para cada vértice del grafo. Cada nodo de la lista enlazada contiene información sobre un vértice adyacente al vértice original. Por ejemplo, si tenemos un grafo con tres vértices A, B y C, y dos arcos que conectan A con B y B con C, podríamos representarlo utilizando una lista de adyacencia de la siguiente manera:
A: [B]
B: [A, C]
C: [B]
En esta representación, la lista enlazada para cada vértice contiene los vértices adyacentes a ese vértice en particular. Así, por ejemplo, la lista enlazada para el vértice A contiene solo el vértice B, ya que hay un arco que conecta a A con B. La lista enlazada para el vértice B, por otro lado, contiene tanto a A como a C, ya que hay arcos que conectan a B con ambos vértices.
Una de las ventajas de la lista de adyacencia es que es fácil de implementar y es adecuada para grafos que tienen un número variable de vértices y arcos. Sin embargo, una desventaja es que puede ser menos eficiente que otras estructuras de datos para algunas operaciones, como encontrar todos los vértices adyacentes a un vértice determinado.
A continuacion el codigo para c++:
#include
#include
#include
using namespace std;
// Una estructura para representar un vértice en el grafo
struct Vertex {
int data;
};
// Una estructura para representar un arco en el grafo
struct Edge {
Vertex* source;
Vertex* dest;
int weight;
};
// Una clase para representar un grafo utilizando una lista de adyacencia
class Graph {
public:
// Un mapa para almacenar todos los vértices del grafo
unordered_map> adj_list;
// Agrega un nuevo vértice al grafo
void add_vertex(Vertex* v) {
adj_list[v] = vector();
}
// Agrega un nuevo arco al grafo
void add_edge(Edge* e) {
adj_list[e->source].push_back(e);
}
};
int main() {
// Creamos algunos vértices
Vertex* v1 = new Vertex{1};
Vertex* v2 = new Vertex{2};
Vertex* v3 = new Vertex{3};
// Creamos algunos arcos
Edge* e1 = new Edge{v1, v2, 1};
Edge* e2 = new Edge{v2, v3, 1};
Edge* e3 = new Edge{v1, v3, 1};
// Creamos un grafo y agregamos los vértices y arcos
Graph g;
g.add_vertex(v1);
g.add_vertex(v2);
g.add_vertex(v3);
g.add_edge(e1);
g.add_edge(e2);
g.add_edge(e3);
// Imprimimos la lista de adyacencia del grafo
for (auto [v, edges] : g.adj_list) {
cout << v->data << ": ";
for (Edge* e : edges) {
cout << e->dest->data << " ";
}
cout << endl;
}
return 0;
}
En este ejemplo, hemos creado una clase Graph que tiene un mapa adj_list para almacenar todos los vértices y sus listas de adyacencia. La clase tiene dos métodos, add_vertex y add_edge, que permiten agregar vértices y arcos al grafo, respectivamente.
Link de apoyo