DanieleCalisti

Djikstra

Apr 30th, 2021 (edited)
481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. //Autore: Daniele Calisti
  2.  
  3. //Programma per simulare l'algoritmo di Djikstra
  4.  
  5. #include <limits.h>         //Serve per gestire i numeri infiniti
  6. #include <stdio.h>          //Serve per i/o
  7. #include <bits/stdc++.h>    //Include tutte strutture dati e funzioni della stl
  8. using namespace std;
  9.  
  10.  
  11. // Funzione per trovare il vertice con distanza minima tra tutti gli altri vertici
  12. int minDistanza(vector<int>& dist, vector<bool>& visitato,int V)
  13. {
  14.     int min = INT_MAX, min_index;
  15.  
  16.     for (int v = 0; v < V; v++)
  17.         if (visitato[v] == false && dist[v] <= min)
  18.             min = dist[v], min_index = v;
  19.  
  20.     return min_index;
  21. }
  22.  
  23. void stampaSoluzione(vector<int>& dist,int V)
  24. {
  25.     printf("Vertice \t Distanza dalla sorgente\n");
  26.     for (int i = 0; i < V; i++)
  27.         printf("%d \t\t %d\n", i+1, dist[i]);
  28. }
  29.  
  30.  
  31. void dijkstra(vector<vector<int>>& mat, int src, int V)
  32. {
  33.     vector<int> dist(V,INT_MAX); // Includerà le distanze dal vertice al vertice sorgente
  34.  
  35.     vector<bool> visitato(V); // visitato[i] sarò true se ho visitato il vertice, false altrimenti
  36.  
  37.    
  38.     //La distanza da un vertice al vertice stesso è 0
  39.     dist[src] = 0;
  40.  
  41.     // In questo ciclo trovo il cammino minimo
  42.     for (int count = 0; count < V - 1; count++) {
  43.         // Prendo la distanza minima dei vertici che non ho visitato
  44.         int u = minDistanza(dist, visitato,V);
  45.  
  46.         //Mi segno che l'ho visitato
  47.         visitato[u] = true;
  48.  
  49.         //Aggiorno la distanza del vertice adiacente partendo dal vertice che ho preso
  50.         for (int v = 0; v < V; v++)
  51.             // Agggiorno la distanza solo se non ho visitato il vertice
  52.             if (!visitato[v] && mat[u][v] && dist[u] != INT_MAX && dist[u] + mat[u][v] < dist[v])
  53.                 dist[v] = dist[u] + mat[u][v];
  54.     }
  55.  
  56.     stampaSoluzione(dist,V);
  57. }
  58.  
  59. vector<vector<int>> caricaMatrice(vector<vector<int>>& mat)
  60. {
  61.     cout<<"Inserisci la matrice di adiacenza \n";
  62.     for(int i=0;i<mat.size();i++)
  63.     {
  64.         for(int j=0;j<mat[0].size();j++)
  65.         {
  66.             //Se è il vertice stesso non devo inserire niente perchè è 0
  67.             if(i == j)
  68.                 continue;
  69.                
  70.             cout<<"Cella "<<i+1<<"-"<<j+1<<": ";
  71.             cin>>mat[i][j];
  72.         }
  73.     }
  74.    
  75.     return mat;
  76. }
  77.  
  78. int chiediVertici()
  79. {
  80.     int V;
  81.     cout<<"Numero vertici del grafo: ";
  82.     cin>>V;
  83.    
  84.     return V;
  85. }
  86.  
  87. int chiediSorgente()
  88. {
  89.     int sorgente;
  90.     cout<<"Inserisci il vertice che vuoi raggiungere: ";
  91.     cin>>sorgente;
  92.    
  93.     return sorgente;
  94. }
  95. int main()
  96. {
  97.     int V,sorgente; //V --> vertici del grafo, sorgente --> nodo da raggiungere
  98.    
  99.     V = chiediVertici();
  100.    
  101.     vector<vector<int>> mat(V, vector<int>(V,0));
  102.    
  103.     mat = caricaMatrice(mat);       //Gestito il fatto che un vertice ha peso 0 sullo stesso vertice, quindi non serve inserirlo
  104.    
  105.     sorgente = chiediSorgente();
  106.     sorgente--;
  107.    
  108.     dijkstra(mat, sorgente,V);
  109.  
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment