Код: Выделить всё
#include
#include
#include
#define NON_HA_PARENT -1
using namespace std;
//void mostra_citta(vector vect_citta, int n_nodi);
//void mostra(vector distanze, int n_nodi, int radice, vector parent, vector vect_citta);
void algoritmo(vector graph, int radice, int n_nodi, vector vect_citta);
void mostra_path(int vertice_corrente, vector parent, vectorvect_citta);
int controllo_dei_nodi_vicini(vector distanze, vector sono_stati_visitati, int n_nodi);
int prendi_source(int& n_nodi, vector& vect_citta);
bool controllo_presenza(string& input);
vector costruisci_graph(int n_nodi, vector vect_citta);
vector crea_vect_citta(int& n_nodi);
vector costruzione_graph_classe(int n_nodi, vector vect_citta);
class db_le_citta
{
public:
vector distanze_citta ={//0 1 2 3 4 5 6 7 8 9 10 11 12
{0 ,153,0 ,0 ,263,0 ,312,0 ,0 ,0 ,0 ,0 ,0 }, //bari
{153,0 ,582,0 ,413,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 }, //lecce
{0 ,582,0 ,211,592,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 }, //catania
{0 ,0 ,211,0 ,716,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 }, //palermo
{263,413,592,716,0 ,227,247,0 ,0 ,0 ,0 ,0 ,0 }, //napoli
{0 ,0 ,0 ,0 ,227,0 ,210,275,0 ,0 ,0 ,513,0 }, //roma
{312,0 ,0 ,0 ,247,210,0 ,399,365,0 ,0 ,0 ,0 }, //pescara
{0 ,0 ,0 ,0 ,0 ,275,399,0 ,105,0 ,0 ,253,0 }, //firenze
{0 ,0 ,0 ,0 ,0 ,0 ,365,105,0 ,154,213,294,0 }, //bologna
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,154,0 ,278,0 ,0 }, //venezia
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,213,278,0 ,346,143}, //milano
{0 ,0 ,0 ,0 ,0 ,513,0 ,253,294,0 ,346,0 ,169}, //genova
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,143,169,0 }, //torino
};
vector nomi_citta = {"bari","lecce","catania","palermo","napoli","roma","pescara","firenze","bologna","venezia","milano","genova","torino"};
//aggiungere metodi per aggiunta di citta
};
int main()
{
int n_nodi = 0;
cout > n_nodi;
vector vect_citta = crea_vect_citta(n_nodi);
vector grap = costruisci_graph(n_nodi, vect_citta);
int source = prendi_source(n_nodi, vect_citta);
algoritmo(grap, source, n_nodi, vect_citta);
return 0;
}
void algoritmo(vector graph, int radice, int n_nodi, vector vect_citta) {
vector distanze(n_nodi), parent(n_nodi);
vector sono_stati_visitati(n_nodi); //flags per i visitati
//inizializzo tutto
for (int i = 0; i < n_nodi; i++)
{
distanze[i] = INT_MAX;
sono_stati_visitati[i] = false;
}
distanze[radice] = 0;// distanza dalla radice = 0
parent[radice] = NON_HA_PARENT;
for (int i = 0; i < n_nodi - 1; i++)
{
int nodo_vicino = controllo_dei_nodi_vicini(distanze, sono_stati_visitati, n_nodi);
//nodi vicini vengono analizzati, int nodo vicino � il nodo preso in considerazione
sono_stati_visitati[nodo_vicino] = true; //� stato visitato il nodo vicino
for (int adiacente = 0; adiacente < n_nodi; adiacente++) //fase di update delle distanze dei n_nodi adiacenti
{
if (!sono_stati_visitati[adiacente] //se non � nell'array dei visitati "sono_stati_visitati"
&& graph[nodo_vicino][adiacente] //esiste la connessione tra il vicino e l'adiacente
&& distanze[nodo_vicino] != INT_MAX //distanza del nodo vicino non � infinita
&& distanze[nodo_vicino] + graph[nodo_vicino][adiacente] < distanze[adiacente]) //il peso del viaggio dalla source al nodo adiacente � piccolo rispetto alla distanza corrente dell'adiacente
{
parent[adiacente] = nodo_vicino; //parent serve per printare il path
distanze[adiacente] = distanze[nodo_vicino] + graph[nodo_vicino][adiacente];
}
}
}
//mostriamo
for (int i = 0; i < n_nodi; i++) {
if (i != radice)
{
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78532142/vector-subscript-out-of-range-dijkstra[/url]