O objetivo deste projeto é desenvolver uma aplicação em Java que utiliza um grafo como modelo de dados, seguindo os princípios da orientação a objetos e utilizando padrões de design de software. A aplicação será gráfica, permitindo que o utilizador visualize, interaja e obtenha informações sobre um sistema integrado de transportes.
O sistema integrado de transportes consiste numa lista de paragens, “Stop”, e num conjunto de rotas, “Route” que ligam algumas dessas paragens, sendo as mesmas bidirecionais. Esta rede permitirá, entre outras coisas, saber que opções tem um utilizador da rede para se deslocar entre duas dessas paragens. A rede será modelada através de um grafo: os vértices correspondem às paragens (stops) e as arestas correspondem às rotas (routes).
A estrutura de dados escolhida para suportar a rede de transportes foi o ADT Graph. Os grafos, como estruturas de dados, podem ser implementados de diversas formas, mas para a sua utilização vamos abstrair-nos desses pormenores e utilizá-los na forma de um ADT.
Este ADT Graph<V, E> é caracterizado por modelar grafos que possuem: • Vértices do tipo Vertex, que internamente guardam elementos do tipo genérico V, e; • Arestas do tipo Edge<E, V>, que internamente guardam elementos do tipo genérico E e que conectam vértices do tipo Vertex; No caso da Figura 1, por exemplo, V será do tipo Character e E será do tipo Integer.
As operações disponibilizadas são as seguintes:
- int numVertices(): Retorna o número total de vértices no grafo.
- int numEdges(): Retorna o número total de arestas no grafo.
- Collection<Vertex> vertices(): Retorna uma coleção de todos os vértices no grafo. Se não houver vértices, retorna uma coleção vazia.
- Collection<Edge<E, V>> edges(): Retorna uma coleção de todas as arestas no grafo. Se não houver arestas, retorna uma coleção vazia.
- Collection<Edge<E, V>> incidentEdges(Vertex v): Retorna uma coleção de arestas incidentes a um vértice especificado.
- Vertex opposite(Vertex v, Edge<E, V> e): Retorna o vértice oposto a um vértice dado ao longo de uma aresta dada.
- boolean areAdjacent(Vertex u, Vertex v): Verifica se dois vértices são adjacentes, ou seja, se há uma aresta que os conecta.
- Vertex insertVertex(V vElement): Insere um novo vértice com um elemento dado no grafo.
- Edge<E, V> insertEdge(Vertex u, Vertex v, E edgeElement): Insere uma nova aresta entre dois vértices existentes no grafo.
- Edge<E, V> insertEdge(V vElement1, V vElement2, E edgeElement): Insere uma nova aresta entre dois vértices existentes, especificados por seus elementos.
- V removeVertex(Vertex v): Remove um vértice e todas as arestas incidentes, retornando o elemento do vértice removido.
- E removeEdge(Edge<E, V> e): Remove uma aresta, retornando o elemento da aresta removida.
- V replace(Vertex v, V newElement): Substitui o elemento de um vértice por um novo elemento e retorna o elemento anterior.
- E replace(Edge<E, V> e, E newElement): Substitui o elemento de uma aresta por um novo elemento e retorna o elemento anterior.
Representa uma rota entre duas paragens. Uma rota tem uma paragem inicial, uma paragem final, e a distância, duração e custo dos diferentes tipos de transporte. A distância é em quilómetros, a duração em minutos e o custo em euros. Os diferentes tipos de transporte são: comboio, autocarro, barco, a pé e bicicleta. Esta classe permite construir um objeto da mesma com os parâmetros descritos acima, permite obtê-los e mudá-los.
Representa uma paragem em uma rede de transporte. Uma paragem tem um código, um nome, uma latitude e uma longitude. Esta classe permite construir um objeto da mesma com os parâmetros descritos acima, permite obtê-los e mudá-los.
Esta classe representa um mapa de transporte com paradas e rotas, fornecendo métodos para adicionar e remover paragens e rotas, e para obter paragens e rotas pelo seu código de paragem.
Esta classe permite testar os métodos implementados em TransportMap, se a adição e remoção das paragens e das rotas, bem como a sua obtenção é feita corretamente.
Esta classe permite visualizar o mapa do Sistema Integrado de Transportes.
Responsável por correr o programa, integrando a importação dos dados das paragens e das rotas.
A execução do método main deverá apresentar o seguinte resultado:
Figura 1 - Mapa do Sistema Integrado de Transportes
Ao executar o método main deverá apresentar:

Ao executar o método addStop deverá apresentar:

Ao executar o método addRoute deverá apresentar:

Ao executar o método removeRoute deverá apresentar:

Ao executar o método removeStop deverá apresentar:

O projeto tem as seguintes bibliotecas importadas a partir do Maven:
- JUnit 5.8.1
- SmartGraph 2.0.0
- OpenCSV 5.9
Versão do Java Development Kit (JDK) com suporte para JavaFX. A versão recomendada para a Unidade Curricular é a BellSoft Liberica JDK, versão 17 LTS (FULL). Transferência disponível em https://bell-sw.com/pages/downloads/#/java-17-lts
