This repository has been archived by the owner on Sep 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
funcoes.cpp
125 lines (97 loc) · 4.15 KB
/
funcoes.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "funcoes.h"
// Função que realiza a leitura dos dados de um arquivo
void le_arquivo (const string & nome_arquivo, unordered_map<string, list<adjacente>>& mapa) {
// Abre um arquivo contendo a relação de cidades de distâncias
ifstream arq(nome_arquivo);
if (!arq.is_open()) {
perror("Erro ");
exit(errno);
}
string linha;
string cidade1, cidade2;
int distancia;
while (getline(arq, linha)) {
stringstream ss(linha);
getline(ss, cidade1, ','); // Seleciona a string até o delimitador (,)
getline(ss, cidade2, ',');
ss >> distancia; // Único inteiro da linha do arquivo
// Adiciona todas as cidades, cidades adjacentes a elas e
// suas distâncias em uma tabela chamada "mapa"
adjacente aux; // auxiliar
aux = {distancia, cidade2};
mapa[cidade1].push_back(aux);
}
}
// Função que faz a entrada de dados e verifica se esses dados estão corretos
string entrada_dados(const string& trajeto, const unordered_map<string, list<adjacente>>& tabela) {
string cidade;
while (true) {
cout << "Entre com a cidade de " << trajeto << ": " << endl;
getline(cin, cidade);
if (tabela.count(cidade) > 0) {
return cidade; // Cidade válida, retorna
} else {
cout << "Cidade não encontrada na tabela. Por favor, digite novamente." << endl;
}
}
}
// Função que implementa a lógica do algoritmo de dijkstra em uma tabela hash chamada "tabela_dijkstra"
unordered_map<string, nodo> dijkstra (unordered_map<string, list<adjacente>>& mapa, const string& destino) {
// Cria a tabela dijkstra
unordered_map<string, nodo> tabela_dijkstra;
// Cria uma lista para armazenar os nodos da tabela dijkstra
list<string> nodos;
// Lê as cidades/nodos para dentro da lista "nodos"
for (auto & cidade: mapa) {
nodos.push_back(cidade.first);
}
// Inicializa a tabela dijkstra
for (auto & nodo : nodos) {
tabela_dijkstra[nodo] = {INT_MAX, ""}; // Distância "infinita", sem procedente ainda
}
tabela_dijkstra[destino] = {0, destino}; // Distância zero para o nodo destino
// Extrai da lista nodos o nodo com menor distância até o nodo destino
while (!nodos.empty()) {
string nodo_atual;
int menor_distancia = INT_MAX;
for (auto & nodo: nodos) {
if (tabela_dijkstra[nodo].custo < menor_distancia) {
menor_distancia = tabela_dijkstra[nodo].custo;
nodo_atual = nodo;
}
}
// Para cada nodo adjacente do nodo com menor distância:
for (auto & adj : mapa[nodo_atual]) {
// Calcula a distância do nodo adjacente
int distancia = tabela_dijkstra[nodo_atual].custo + adj.distancia;
// Se a distância encontrada for menor do que a distância atual do nodo:
if (distancia < tabela_dijkstra[adj.cidade].custo) {
tabela_dijkstra[adj.cidade] = {distancia, nodo_atual};
}
}
// Remove o nodo atual da lista de nodos não visitados
nodos.remove(nodo_atual);
}
return tabela_dijkstra;
}
// Função que procura em uma tabela dijkstra a melhor rota entre duas cidades
string melhor_rota (unordered_map<string, nodo>& tabela_dijkstra, const string & partida, const string & destino){
// O trejeto começa na cidade de partida
string trajeto = partida;
// Armazena a melhor rota para o trajeto de uma cidade para outra
string melhor_rota;
// Acessa os dados da tabela dijkstra e analisa as cidades da melhor rota
melhor_rota += partida + " ";
while (trajeto != destino) {
trajeto = tabela_dijkstra[trajeto].procedente;
melhor_rota += trajeto + " ";
}
return melhor_rota;
}
// Função que procura em uma tabela dijkstra a melhor distância entre duas cidades
int melhor_distancia (unordered_map<string, nodo>& tabela_dijkstra, const string & partida){
int distancia;
// Procura na tabela dijkstra qual é a distância/custo do nodo destino
distancia = tabela_dijkstra[partida].custo;
return distancia;
}