Módulo 6 - Grafos: vértices, arestas e o mundo em rede

Representar um grafo: lista e matriz de adjacência

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

O que você vai aprender

  • Guardar um grafo como lista de adjacência.
  • Guardar um grafo como matriz de adjacência.
  • Comparar as duas quanto a espaço e velocidade de consulta.
  • Escolher a representação conforme o tamanho e a densidade do grafo.

Cada vértice com a sua lista de vizinhos

A lista de adjacência é a representação mais usada na prática. A ideia é direta: para cada vértice, guarde uma lista com os vértices ligados a ele, os seus vizinhos. Se o vértice A se liga a B e a C, a lista de A é [B, C]. Se B se liga só a A, a lista de B é [A]. O grafo inteiro vira um conjunto dessas listinhas, uma por vértice. A grande vantagem é o espaço: você só guarda as ligações que existem de verdade. Num grafo com muitos vértices mas poucas arestas cada, chamado esparso, isso economiza muita memória. E percorrer os vizinhos de um vértice é imediato, porque eles já estão listados ali, prontos. É por isso que redes sociais, com milhões de pessoas mas poucas amizades por pessoa em relação ao total, quase sempre usam lista de adjacência.

grafo <- {
  "A": ["B", "C"],
  "B": ["A", "D"],
  "C": ["A", "D"],
  "D": ["B", "C"]
}
// vizinhos de A:
escreva(grafo["A"])   // ["B", "C"]
// A e D sao vizinhos? procurar D na lista de A:
escreva("D" está em grafo["A"])   // falso (A liga a B e C, nao a D)

Lista de adjacência: cada vértice aponta para a sua lista de vizinhos. Simples, econômica e rápida para percorrer vizinhos.

A grade de conexões: a matriz de adjacência

A matriz de adjacência usa a estrutura que você estudou no curso intermediário: uma matriz, a grade de linhas e colunas. Numere os vértices de 0 em diante e monte uma grade quadrada com um vértice por linha e o mesmo por coluna. Na célula da linha A com a coluna B você escreve 1 se existe aresta de A para B, e 0 se não existe. Para saber se dois vértices são vizinhos, basta olhar uma célula: matriz[A][B]. Essa consulta é instantânea, um único acesso, e é a maior vantagem da matriz. O preço é o espaço: uma grade de N vértices por N vértices ocupa N ao quadrado células, mesmo que quase todas sejam zero. Para um grafo com muitas ligações (denso) e poucos vértices, a matriz compensa. Para um grafo esparso e grande, ela desperdiça memória com um mar de zeros.

À esquerda, um grafo com quatro vértices A, B, C, D e algumas arestas. No centro, a lista de adjacência: A aponta para B e C, B para A e D, e assim por diante. À direita, a matriz de adjacência: uma grade 4 por 4 com linhas e colunas A, B, C, D, preenchida com 1 onde há aresta e 0 onde não há, mostrando as duas formas de guardar o mesmo grafo.
O mesmo grafo em duas roupas: a lista de adjacência (vizinhos por vértice) e a matriz de adjacência (grade de 1 e 0).

🎮 Jogo da aula

Leia a lista de adjacência

Este grafo está guardado como lista de adjacência. Descubra quantos vizinhos o vértice B tem.

grafo <- {
  "A": ["B", "C"],
  "B": ["A", "C", "D"],
  "C": ["A", "B"],
  "D": ["B"]
}
vizinhos <- grafo["B"]
escreva(tamanho(vizinhos))

Qual das duas escolher

A escolha depende de duas coisas: o tamanho do grafo e a sua densidade. Se o grafo é esparso, com poucas arestas por vértice, a lista de adjacência quase sempre vence: economiza memória e é ótima para percorrer vizinhos, que é o que a maioria dos algoritmos faz. Se o grafo é denso, com quase todos os pares ligados, ou se o programa precisa checar muitas vezes e rápido se dois vértices específicos são vizinhos, a matriz de adjacência compensa a memória extra com consultas de um passo. Na dúvida, e na prática do dia a dia, a lista de adjacência é a escolha padrão, porque a maioria dos grafos reais é esparsa e grande. A matriz aparece mais em grafos pequenos, densos ou em algoritmos que dependem de olhar pares direto. Saber que as duas existem, e o que cada uma custa, já resolve a decisão na hora certa.

Teste rápido

Quanto espaço uma matriz de adjacência ocupa para um grafo de N vértices, e por quê?

Perguntas frequentes

O que quer dizer um grafo ser esparso ou denso?
Um grafo esparso tem poucas arestas em relação ao número de vértices, ou seja, cada vértice se liga a poucos outros. Um grafo denso tem muitas arestas, próximo do máximo possível, com quase todos os pares ligados. Redes sociais e mapas costumam ser esparsos; grafos pequenos e muito conectados são densos. A densidade guia a escolha da representação.
Como a matriz de adjacência muda num grafo dirigido?
Num grafo não dirigido a matriz é simétrica: se matriz[A][B] é 1, matriz[B][A] também é, porque a aresta vale nos dois sentidos. Num grafo dirigido a matriz pode ser assimétrica: matriz[A][B] pode ser 1 (há aresta de A para B) enquanto matriz[B][A] é 0. A direção da aresta aparece justamente nessa possível diferença entre as duas células.
E se o grafo tiver peso, como guardo isso?
Na matriz, em vez de 1 e 0, você guarda o peso na célula (e um valor especial, como infinito ou zero combinado, para dizer que não há aresta). Na lista de adjacência, cada vizinho vira um par com o vizinho e o peso, por exemplo [B, 4]. As duas representações se adaptam a grafos com peso sem mudar a ideia central.
Qual é mais rápida para saber se A e B são vizinhos?
A matriz de adjacência, disparado. Ela responde num único acesso: basta olhar a célula matriz[A][B]. Na lista de adjacência você precisa percorrer a lista de vizinhos de A procurando B, o que é mais lento se a lista for longa. Por isso a matriz brilha quando o programa faz muitas dessas consultas de vizinhança.
Qual é mais rápida para percorrer todos os vizinhos de um vértice?
A lista de adjacência. Ela já guarda os vizinhos numa lista pronta, então percorrer todos custa proporcional ao número real de vizinhos. Na matriz, para achar os vizinhos de um vértice você precisa varrer a linha inteira, inclusive as N células, mesmo as que valem zero. Como quase todo algoritmo de grafo percorre vizinhos, a lista costuma sair na frente.
Posso trocar de representação no meio do programa?
Pode, convertendo uma na outra, mas isso custa tempo e raramente vale a pena. O comum é escolher uma representação no início, conforme o tamanho e a densidade do grafo, e manter. Se você percebeu cedo que o grafo é grande e esparso, comece com lista de adjacência e evite a conversão depois.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.