-
Estruturas Básicas
- Grafo: conjunto de vértices e arestas
- Representações:
// Lista de Adjacência list<Aresta> listas_adj[] // Matriz de Adjacência int matriz_adj[MAXV][MAXV]
-
Algoritmo de Prim (MST)
- Objetivo: Encontrar árvore geradora mínima
- Estruturas:
bool visitado[] // Vértices na MST int melhor_aresta[] // Menor peso por vértice int pai[] // Estrutura da MST
- Passos:
- Inicializar vértices como não visitados
- Começar da origem
- Para cada não visitado:
- Marcar como visitado
- Atualizar custos dos vizinhos
- Escolher próximo com menor custo
-
Algoritmo de Dijkstra
- Objetivo: Menor caminho entre vértices
- Estruturas:
int melhor_distancia[] // Menor distância int pai[] // Caminho mínimo bool visitado[] // Processados
- Passos:
- Inicializar distâncias = INF
- Origem com distância 0
- Para cada não visitado:
- Marcar visitado
- Atualizar distâncias (relaxamento)
- Escolher próximo mais próximo
-
Prim:
- Soma pesos das arestas na árvore
- Conecta todos os vértices
- Gera uma árvore
-
Dijkstra:
- Soma pesos no caminho
- Encontra caminho entre dois pontos
- Gera caminhos mínimos
-
Inicializações:
#define INF 9999 #define MAXV 100000 // Sempre inicializar: visitado[] = false distancia[] = INF pai[] = -1
-
Atualizações:
// Prim melhor_aresta[v] = peso_aresta // Dijkstra melhor_distancia[v] = dist_atual + peso_aresta
-
Complexidade:
- Matriz: O(V²)
- Lista + Heap: O(E log V)
-
Grafo Desconexo:
- Verificar se encontrou solução
- Tratar INF adequadamente
-
Restrições:
- IDH mínimo: marcar como visitado
- Verificar condições antes de relaxar
- Inicialização correta das estruturas
- Tratamento de casos especiais
- Verificação de conectividade
- Cálculo correto do resultado final
- Tratamento de entrada/saída
- Faça o passo a passo no papel
- Verifique inicializações
- Trate casos especiais
- Entenda as diferenças entre algoritmos
- Pratique as variações dos problemas