DanieleCalisti

Djikstra

Apr 29th, 2021
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <limits.h>
  2. #include <stdio.h>
  3. #include <bits/stdc++.h>  
  4. using namespace std;
  5.  
  6. // Funzione per trovare il vertice con distanza minima tra tutti gli altri vertici
  7. int minDistanza(vector<int>& dist, vector<bool>& visitato,int V)
  8. {
  9.     int min = INT_MAX, min_index;
  10.  
  11.     for (int v = 0; v < V; v++)
  12.         if (visitato[v] == false && dist[v] <= min)
  13.             min = dist[v], min_index = v;
  14.  
  15.     return min_index;
  16. }
  17.  
  18. void stampaSoluzione(vector<int>& dist,int V)
  19. {
  20.     printf("Vertice \t Distanza dalla sorgente\n");
  21.     for (int i = 0; i < V; i++)
  22.         printf("%d \t\t %d\n", i, dist[i]);
  23. }
  24.  
  25.  
  26. void dijkstra(vector<vector<int>>& mat, int src, int V)
  27. {
  28.     vector<int> dist(V); // Includerà le distanze dal vertice al vertice sorgente
  29.  
  30.     vector<bool> visitato(V); // visitato[i] sarò true se ho visitato il vertice, false altrimenti
  31.  
  32.     //Inizializzo le distanze a infinito e l'array a false per dire che non ho visitato nessuno
  33.     for (int i = 0; i < V; i++)
  34.         dist[i] = INT_MAX, visitato[i] = false;
  35.  
  36.     //La distanza da un vertice al vertice stesso è 0
  37.     dist[src] = 0;
  38.  
  39.     // In questo ciclo trovo il cammino minimo
  40.     for (int count = 0; count < V - 1; count++) {
  41.         // Prendo la distanza minima dei vertici che non ho visitato
  42.         int u = minDistanza(dist, visitato,V);
  43.  
  44.         //Mi segno che l'ho visitato
  45.         visitato[u] = true;
  46.  
  47.         //Aggiorno la distanza del vertice adiacente partendo dal vertice che ho preso
  48.         for (int v = 0; v < V; v++)
  49.  
  50.             // Agggiorno la distanza solo se non ho visitato il vertice
  51.             if (!visitato[v] && mat[u][v] && dist[u] != INT_MAX && dist[u] + mat[u][v] < dist[v])
  52.                 dist[v] = dist[u] + mat[u][v];
  53.     }
  54.  
  55.    
  56.     stampaSoluzione(dist,V);
  57. }
  58.  
  59. int main()
  60. {
  61.     int V,sorgente;
  62.     cout<<"Numero vertici del grafo: ";
  63.     cin>>V;
  64.     vector<vector<int>> mat(V, vector<int>(V,0));
  65.    
  66.     cout<<"Inserisci la matrice di adiacenza \n";
  67.     for(int i=0;i<V;i++)
  68.     {
  69.         for(int j=0;j<V;j++)
  70.         {
  71.             cout<<"Cella "<<i+1<<"-"<<j+1<<": ";
  72.             cin>>mat[i][j];
  73.         }
  74.     }
  75.    
  76.     cout<<"Inserisci il vertice che vuoi raggiungere: ";
  77.     cin>>sorgente;
  78.    
  79.     dijkstra(mat, sorgente,V);
  80.  
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment