Uma das formas mais populares de representar grafos é através de listas de adjacência. Uma lista de adjacência é uma maneira de representar um grafo como um array de listas. Cada elemento do array representa um vértice do grafo, e a lista associada a esse vértice contém os vértices que lhe são adjacentes.
Dado o grafo dirigido na figura, podemos obter a sua lista de adjacência:
Grafo dirigido com 8 vértices e 10 arestas. Note que os vértices 5 e 8 têm uma ligação bidirecional.
Como pode observar, a representação do grafo por lista de adjacência é bem mais compacta em comparação com a matriz de adjacência. Isto acontece porque não existem assim tantas arestas no nosso grafo. Em alguns casos, quando o número de arestas é suficientemente grande, pode ser mais eficiente armazenar o grafo numa matriz de adjacência.
Desafio: Arestas para Lista de Adjacência
Dado um grafo não dirigido com v vértices e e arestas, pretende-se obter a sua lista de adjacência.
Entrada
A primeira linha da entrada contém dois inteiros v (1 ≤ v ≤ 100 000) e e (1 ≤ e ≤ 100 000).
As e linhas seguintes contêm pares de inteiros v1, v2 (1 ≤ v1, v2 ≤ v), o que significa que o vértice v1 está ligado ao vértice v2 e vice-versa.
Saída
O programa deve imprimir a lista de adjacência do grafo dado. Cada linha deve começar com o id de um vértice seguido de dois pontos (:) e, em seguida, as suas ligações. As ligações em cada linha devem ser separadas por um espaço. A ordem tanto dos vértices como das ligações pode ser arbitrária.