graph implementation c using adjacency list
Este tutorial explica la implementación de gráficos en C ++. También aprenderá sobre diferentes tipos, representaciones y aplicaciones de gráficos:
Un gráfico es una estructura de datos no lineal. Un gráfico se puede definir como una colección de nodos que también se denominan 'vértices' y 'aristas' que conectan dos o más vértices.
Un gráfico también puede verse como un árbol cíclico donde los vértices no tienen una relación padre-hijo pero mantienen una relación compleja entre ellos.
número aleatorio entre 1 y 10 c ++
=> Haga clic aquí para ver la serie de capacitación Absolute C ++.
Lo que vas a aprender:
¿Qué es un gráfico en C ++?
Como se indicó anteriormente, un gráfico en C ++ es una estructura de datos no lineal definida como una colección de vértices y aristas.
A continuación se muestra un ejemplo de una estructura de datos de gráfico.
El gráfico G anterior es un ejemplo. El gráfico G es un conjunto de vértices {A, B, C, D, E} y un conjunto de aristas {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Tipos de gráficos: gráfico dirigido y no dirigido
Un gráfico en el que los bordes no tienen direcciones se llama gráfico no dirigido. El gráfico que se muestra arriba es un gráfico no dirigido.
Un gráfico en el que los bordes tienen direcciones asociadas a ellos se llama gráfico dirigido.
A continuación se muestra un ejemplo de un gráfico dirigido.
En el gráfico dirigido que se muestra arriba, los bordes forman un par ordenado en el que cada borde representa un camino específico de un vértice a otro vértice. El vértice desde el que se inicia el camino se llama ' Nodo inicial 'Mientras que el vértice en el que termina la ruta se llama' Nodo terminal ”.
Así, en el gráfico anterior, el conjunto de vértices es {A, B, C, D, E} y el conjunto de aristas es {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Discutiremos la terminología del gráfico o los términos comunes utilizados en relación con el gráfico a continuación.
Terminología gráfica
- Vértice: Cada nodo del gráfico se llama vértice. En el gráfico anterior, A, B, C y D son los vértices del gráfico.
- Borde: El vínculo o camino entre dos vértices se llama borde. Conecta dos o más vértices. Los diferentes bordes en el gráfico anterior son AB, BC, AD y DC.
- Nodo adyacente: En un gráfico, si dos nodos están conectados por un borde, se denominan nodos adyacentes o vecinos. En el gráfico anterior, los vértices A y B están conectados por el borde AB. Por tanto, A y B son nodos adyacentes.
- Grado del nodo: El número de bordes que están conectados a un nodo en particular se llama grado del nodo. En el gráfico anterior, el nodo A tiene un grado 2.
- Camino: La secuencia de nodos que debemos seguir cuando tenemos que viajar de un vértice a otro en un gráfico se llama camino. En nuestro gráfico de ejemplo, si necesitamos ir del nodo A al C, entonces la ruta sería A-> B-> C.
- Camino cerrado: Si el nodo inicial es el mismo que un nodo terminal, entonces esa ruta se denomina ruta cerrada.
- Camino simple: Una ruta cerrada en la que todos los demás nodos son distintos se denomina ruta simple.
- Ciclo: Una ruta en la que no hay aristas o vértices repetidos y el primer y último vértice son iguales se llama ciclo. En el gráfico anterior, A-> B-> C-> D-> A es un ciclo.
- Gráfico conectado: Un gráfico conectado es aquel en el que hay un camino entre cada uno de los vértices. Esto significa que no hay un solo vértice que esté aislado o sin un borde de conexión. El gráfico que se muestra arriba es un gráfico conectado.
- Gráfico completo: Un gráfico en el que cada nodo está conectado a otro se llama gráfico completo. Si N es el número total de nodos en un gráfico, entonces el gráfico completo contiene N (N-1) / 2 número de bordes.
- Gráfico ponderado: Un valor positivo asignado a cada borde que indica su longitud (distancia entre los vértices conectados por un borde) se llama peso. El gráfico que contiene los bordes ponderados se denomina gráfico ponderado. El peso de un borde e se denota por w (e) e indica el costo de atravesar un borde.
- Diágrafo: Un dígrafo es un gráfico en el que cada borde está asociado con una dirección específica y el recorrido se puede hacer solo en la dirección especificada.
Representación gráfica
La forma en que la estructura de los datos del gráfico se almacena en la memoria se denomina 'representación'. El gráfico se puede almacenar como una representación secuencial o como una representación vinculada.
Ambos tipos se describen a continuación.
Representación secuencial
En la representación secuencial de gráficos, usamos la matriz de adyacencia. Una matriz de adyacencia es una matriz de tamaño n x n donde n es el número de vértices en el gráfico.
Las filas y columnas de la matriz de adyacencia representan los vértices en un gráfico. El elemento de la matriz se establece en 1 cuando hay un borde presente entre los vértices. Si el borde no está presente, el elemento se establece en 0.
A continuación se muestra un gráfico de ejemplo que muestra su matriz de adyacencia.
Hemos visto la matriz de adyacencia para el gráfico anterior. Tenga en cuenta que, dado que este es un gráfico no dirigido, podemos decir que el borde está presente en ambas direcciones. Por ejemplo, como el borde AB está presente, podemos concluir que el borde BA también está presente.
En la matriz de adyacencia, podemos ver las interacciones de los vértices que son elementos de la matriz que se establecen en 1 cuando el borde está presente y en 0 cuando el borde está ausente.
Ahora veamos la matriz de adyacencia de un gráfico dirigido.
Como se muestra arriba, el elemento de intersección en la matriz de adyacencia será 1 si y solo si hay una arista dirigida de un vértice a otro.
En el gráfico anterior, tenemos dos aristas desde el vértice A. Una arista termina en el vértice B mientras que la segunda termina en el vértice C. Por lo tanto, en la matriz de adyacencia, la intersección de A y B se establece en 1 como la intersección de A y C.
A continuación, veremos la representación secuencial del gráfico ponderado.
A continuación se muestra el gráfico ponderado y su correspondiente matriz de adyacencia.
Podemos ver que la representación secuencial de un gráfico ponderado es diferente de los otros tipos de gráficos. Aquí, los valores distintos de cero en la matriz de adyacencia se reemplazan por el peso real del borde.
El borde AB tiene peso = 4, por lo tanto, en la matriz de adyacencia, establecemos la intersección de A y B en 4. De manera similar, todos los demás valores distintos de cero se cambian a sus respectivos pesos.
La lista de adyacencia es más fácil de implementar y seguir. El recorrido, es decir, para comprobar si hay una arista de un vértice a otro toma O (1) tiempo y eliminar una arista también toma O (1).
Ya sea que el gráfico sea escaso (menos bordes) o denso, siempre ocupa más espacio.
Representación vinculada
Usamos la lista de adyacencia para la representación vinculada del gráfico. La representación de la lista de adyacencia mantiene cada nodo del gráfico y un vínculo a los nodos adyacentes a este nodo. Cuando recorremos todos los nodos adyacentes, establecemos el siguiente puntero en nulo al final de la lista.
Consideremos primero un gráfico no dirigido y su lista de adyacencia.
Como se muestra arriba, tenemos una lista vinculada (lista de adyacencia) para cada nodo. Desde el vértice A, tenemos aristas a los vértices B, C y D. Por lo tanto, estos nodos están vinculados al nodo A en la lista de adyacencia correspondiente.
A continuación, construimos una lista de adyacencia para el gráfico dirigido.
En el gráfico dirigido anteriormente, vemos que no hay bordes que se originen en el vértice E. Por lo tanto, la lista de adyacencia para el vértice E está vacía.
Ahora construyamos la lista de adyacencia para el gráfico ponderado.
Para un gráfico ponderado, agregamos un campo adicional en el nodo de la lista de adyacencia para denotar el peso del borde como se muestra arriba.
Agregar vértices en la lista de adyacencia es más fácil. También ahorra espacio debido a la implementación de la lista vinculada. Cuando necesitamos averiguar si hay una arista entre un vértice y otro, la operación no es eficiente.
Operaciones básicas para gráficos
Las siguientes son las operaciones básicas que podemos realizar en la estructura de datos del gráfico:
- Agrega un vértice: Agrega vértices al gráfico.
- Agrega una ventaja: Agrega un borde entre los dos vértices de un gráfico.
- Mostrar los vértices del gráfico: Muestra los vértices de una gráfica.
Implementación de gráficos de C ++ mediante lista de adyacencia
Ahora presentamos una implementación de C ++ para demostrar un gráfico simple usando la lista de adyacencia.
Aquí vamos a mostrar la lista de adyacencia para un gráfico dirigido ponderado. Hemos utilizado dos estructuras para contener la lista de adyacencia y los bordes del gráfico. La lista de adyacencia se muestra como (start_vertex, end_vertex, weight).
El programa C ++ es el siguiente:
|_+_|Producción:
qué es un código de clave de seguridad
Producción:
Lista de adyacencia de gráficos
(vértice_inicial, vértice_final, peso):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)
Aplicaciones de gráficos
Analicemos algunas de las aplicaciones de los gráficos.
- Los gráficos se utilizan ampliamente en informática para representar gráficos de red, gráficos semánticos o incluso para representar el flujo de cálculo.
- Los gráficos se utilizan ampliamente en los compiladores para representar la asignación de recursos a los procesos o para indicar el análisis del flujo de datos, etc.
- Los gráficos también se utilizan para la optimización de consultas en lenguajes de bases de datos en algunos compiladores especializados.
- En los sitios de redes sociales, los gráficos son las principales estructuras para representar la red de personas.
- Los gráficos se utilizan ampliamente para construir el sistema de transporte, especialmente la red de carreteras. Un ejemplo popular son los mapas de Google, que utiliza ampliamente gráficos para indicar direcciones en todo el mundo.
Conclusión
Un gráfico es una estructura de datos popular y ampliamente utilizada que tiene muchas aplicaciones en el campo de la informática, además de otros campos. Los gráficos consisten en vértices y aristas que conectan dos o más vértices.
Un gráfico puede estar dirigido o no dirigido. Podemos representar gráficos usando una matriz de adyacencia, que es una representación lineal, así como también usando una lista enlazada de adyacencia. También discutimos la implementación del gráfico en este tutorial.
=> Consulte aquí para explorar la lista completa de tutoriales de C ++.
Lectura recomendada
- Tutorial de lista avanzada de Python (orden de lista, reversa, índice, copia, unión, suma)
- Lista de Python: crear, acceder, segmentar, agregar o eliminar elementos
- Lista de direcciones IP de enrutadores predeterminados para marcas comunes de enrutadores inalámbricos
- Las 12 mejores herramientas para crear gráficos de líneas para crear gráficos de líneas impresionantes (RANKINGS 2021)
- Contraseña de inicio de sesión del enrutador predeterminada para los mejores modelos de enrutador (lista 2021)
- Estructura de datos de lista vinculada en C ++ con ilustración
- Estructura de datos de lista enlazada circular en C ++ con ilustración
- Estructura de datos de lista doblemente enlazada en C ++ con ilustración