Bem, se você precisa de eficiência de espaço, uma melhor estrutura de dados compactada seria a melhor - mas é claro que isso não é muito eficiente para acessar ou atualizar ...
Se o seu gráfico tiver um número relativamente pequeno de nós e for bastante denso (digamos que pelo menos 5% de todas as conexões possíveis existam), você poderá achar que é mais eficiente em termos de espaço criar uma matriz de adjacência do que usar listas de arestas. Isso exigiria apenas um bit por conexão possível (direcionada) e um total de n * n bits onde você possui n nós.
Caso contrário, se você precisar usar links vizinhos, não poderá facilmente fazer melhor que uma referência por link, pois esse é o conteúdo mínimo de informações que você precisa armazenar. Se você quiser links de volta, precisará do dobro de links.
Existem alguns truques que você pode tentar sobre isso. Por exemplo, você pode tentar compartilhar subconjuntos de links (se A e B se referirem a cada um de C, D, E, em seguida, armazene apenas a lista de links C, D, E uma vez .....). No entanto, isso ficará complexo rapidamente e duvido que valha a pena o esforço na maioria dos casos.
Outro truque - supondo que seu gráfico tenha um número razoável de nós, você certamente economizará espaço ao indexar - por exemplo, usando um número de índice de nó de 16 bits em vez de um ponteiro / referência completo.