Departamento de Ciência da Computação - UFJF
Disciplina: Teoria dos Grafos
Professor: Gabriel Souza
Este projeto expande o Trabalho 1, incorporando funcionalidades dinâmicas para a manipulação de grafos em C++. Além de carregar um grafo a partir de um arquivo, o programa agora permite:
- Inserir novos nós e arestas dinamicamente.
- Remover nós e arestas, com reindexação dos nós remanescentes para manter o grafo isomorfo ao original.
- Calcular a maior menor distância (o maior dos menores caminhos entre dois nós), utilizando o algoritmo de Floyd–Warshall.
O projeto possui duas implementações distintas de armazenamento:
-
GrafoMatriz:
Utiliza uma matriz de adjacência dinâmica, com capacidade inicial de 10 nós, que é realocada (dobrando a capacidade) quando necessário. Ao remover um nó, a matriz é reconstruída para conter somente os nós remanescentes, com os IDs recalculados de forma sequencial. -
GrafoLista:
Utiliza listas encadeadas para armazenar os vértices e suas arestas. A inserção dos nós é feita de modo a preservar a ordem de leitura, e a remoção envolve atualizar os IDs dos nós remanescentes e as referências das arestas.
| include/
| Grafo.hpp
| GrafoMatriz.hpp
| GrafoLista.hpp
| IntList.hpp
| ListaEncadeada.hpp
| ListaEncadeada.tpp
|
| src/
| Grafo.cpp
| GrafoMatriz.cpp
| GrafoLista.cpp
| IntList.cpp
|
| entradas/
| grafo.txt
|
| main.cpp
Utilize um compilador C++ (por exemplo, clang++) com as opções:
clang++ -o main.out main.cpp src/*.cppO programa é executado via linha de comando. Exemplos:
- Para a versão Matriz:
./main.out -d -m entradas/grafo.txt
- Para a versão Lista:
./main.out -d -l entradas/grafo.txt
Os parâmetros são:
- -d ou -n: Indicam se o grafo é direcionado (-d para direcionado, -n para não direcionado).
- -m ou -l: Selecionam a estrutura de armazenamento (matriz ou lista).
- nome_arquivo.txt: Caminho para o arquivo de entrada que descreve o grafo.
O arquivo deve ter o seguinte formato:
-
Primeira linha:
<ordem> <direcionado> <ponderadoVertices> <ponderadoArestas>Por exemplo, para um grafo com 5 nós não direcionado, sem ponderação:
5 0 0 0 -
Segunda linha (opcional):
Lista de pesos dos vértices, se os vértices forem ponderados. -
Linhas seguintes:
Cada linha representa uma aresta. Se as arestas forem ponderadas, cada linha deve conter:
<origem> <destino> <peso>Caso contrário, os valores de peso são ignorados (e um peso padrão, geralmente 1, é usado).
Exemplo de arquivo de entrada:
5 0 0 0
1 2
2 5
5 4
4 3
3 1
1 4
3 2
1 5
Após o carregamento do grafo, o programa executa as seguintes operações:
-
Exclusão do Nó:
A funçãodeleta_noremove o nó com o id especificado, elimina todas as arestas incidentes e reindexa os nós remanescentes (os IDs dos nós remanescentes serão renumerados de forma sequencial). -
Exclusão da Aresta:
A funçãodeleta_arestaremove a primeira aresta do nó de id 2, conforme definido pelo métodoget_vizinhos. -
Cálculo da Maior Menor Distância:
A funçãocalculaMaiorMenorDistancia(implementada de forma genérica na classe base) utiliza os métodos virtuaisgetPesoArestae (se necessário)get_vizinhospara computar, via Floyd–Warshall, os menores caminhos entre todos os pares de nós e determinar o par com a maior distância mínima.
- As operações de inserção, remoção e reindexação devem ser implementadas de forma consistente nas versões matriz e lista para que os resultados sejam idênticos.
- O cálculo da maior menor distância depende de uma correta reconstrução da estrutura do grafo após remoções.
- Se ocorrerem discrepâncias nos resultados, verifique a reindexação dos nós e a atualização das arestas.