Una de las formas más populares de representar grafos es mediante listas de adyacencia. Una lista de adyacencia consiste en representar un grafo como un arreglo (array) de listas. Cada elemento del arreglo corresponde a un vértice del grafo, y la lista asociada a ese vértice contiene los vértices que son adyacentes a él.
Dado el grafo dirigido de la imagen, podemos obtener su lista de adyacencia:
Grafo dirigido con 8 aristas y 10 aristas. Observa que los vértices 5 y 8 tienen una conexión bidireccional.
Como puedes notar, la representación del grafo con una lista de adyacencia es mucho más compacta que con la matriz de adyacencia. Esto se debe a que nuestro grafo no cuenta con tantas aristas. En algunos casos, cuando el número de aristas es suficientemente grande, podría ser más eficiente almacenar el grafo en una matriz de adyacencia.
Desafío: De Aristas a Lista de Adyacencia
Dado un grafo no dirigido con v vértices y e aristas, se te solicita obtener su lista de adyacencia.
Entrada
La primera línea de la entrada contiene dos números enteros v (1 ≤ v ≤ 100 000) y e (1 ≤ e ≤ 100 000).
Las siguientes e líneas contienen pares de enteros v1, v2 (1 ≤ v1, v2 ≤ v), lo que significa que el vértice v1 está conectado con el vértice v2 y viceversa.
Salida
El programa debe imprimir la lista de adyacencia del grafo dado. Cada fila debe comenzar con el id de un vértice seguido de un punto y coma (:) y luego sus conexiones. Las conexiones de cada fila deben separarse con un espacio. El orden tanto de los vértices como de las conexiones puede ser arbitrario.