¿Qué representación gráfica es mejor para la programación competitiva en C ++: lista de adyacencia o matriz de adyacencia?

En primer lugar, debe comprender que utilizamos principalmente listas de adyacencia para algoritmos simples, pero recuerde que la matriz de adyacencia también es igualmente (o más) importante.
A estas alturas ya debe haber entendido que depende del problema en el que esté trabajando, antes de eso debe comprender los pros y los contras o la representación:
Matriz de adyacencia:

  • si su problema (algoritmo) necesita consultas como cuál es el peso entre dos vértices o si hay algún borde entre estos dos vértices, con la matriz de adyacencia este tipo de consultas tienen una complejidad lineal de tiempo
  • sobre todo útil en problemas de programación dinámica (Floyd Warshall),
  • no es bueno, si hay bordes O (| V |) en el gráfico

Lista de adyacencia:

    • Si desea iterar con vecinos de un nodo (BFS, DFS, Dijkstra), lo que le dará una complejidad lineal de tiempo
    • Si quieres agregación, como recuento de vecinos
    • No es útil cuando hay bordes O (| V | ^ 2) en el gráfico

Para la programación competitiva, siempre es preferible la matriz de adyacencia.
Porque…
1) Es muy fácil de crear, que la lista de adyacencia.
2) Es muy rápido de usar, requiere solo una unidad de tiempo para acceder a cualquier elemento.
3) Es muy fácil de manejar y hay menos posibilidades de cometer errores cuando tienes que escribir códigos más grandes en menos tiempo.
4) No hay ningún problema de gestión del espacio, como en la Lista donde hacemos la asignación dinámica de memoria.

Algunas personas dicen que la lista ahorra espacio, pero solo está en theroy. Cada nodo de la lista requiere mucho más espacio, ya que es una estructura (clase) en sí misma.

Las listas de adyacencia tienen una complejidad espacial de n, mientras que las matrices de adyacencia tienen una complejidad espacial de n ^ 2 .
Las matrices de adyacencia tienen una complejidad de tiempo de O (1) (tiempo constante) para encontrar si dos nodos están conectados, pero las listas de adyacencia ocupan hasta O (n) .
En resumen: si el tiempo es su restricción, use una Matriz de adyacencia .
Si la memoria es su restricción, use la Lista de adyacencia .

Ninguna de las dos representaciones puede llamarse mejor que la otra. Cada representación tiene algunas ventajas y desventajas. Entonces, si el número de vértices es grande en comparación con el número de bordes, use la lista de adyacencia. De lo contrario, use la matriz de adyacencia.