DanieleCalisti

Djikstra

May 5th, 2021 (edited)
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.01 KB | None | 0 0
  1. package Djikstra;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import IO.*;
  6.  
  7. public class Djikstra
  8. {
  9.     private ArrayList<ArrayList<Integer>> mat = new ArrayList<ArrayList<Integer>>();
  10.     private int nodi;
  11.     private int src;
  12.     private IO io;
  13.    
  14.     public Djikstra()
  15.     {
  16.         io = new IO (); //Funzioni di input e output
  17.     }
  18.    
  19.     /**
  20.      *
  21.      * @param mat   Matrice di adiacenza del grafo
  22.      * @param nodi  Numero di nodi sel grafo
  23.      * @param src   Nodo del grafo di raggiungere
  24.      */
  25.     public Djikstra(ArrayList<ArrayList<Integer>> mat, int nodi, int src)
  26.     {
  27.         io = new IO (); //Funzioni di input e output
  28.         this.mat = mat;
  29.         this.nodi = nodi;
  30.         this.src = src;
  31.     }
  32.    
  33.    
  34.     // Funzione per trovare il vertice con distanza minima tra tutti gli altri vertici
  35.     public int minDistanza(ArrayList<Integer> dist, ArrayList<Boolean> visitato)
  36.     {
  37.        
  38.         int min = Integer.MAX_VALUE, min_index = -1;
  39.        
  40.         //Trovo il vertice con distanza minima
  41.         for (int v = 0; v < this.nodi; v++)
  42.             if (visitato.get(v) == false && dist.get(v) <= min) {
  43.                 min = dist.get(v);
  44.                 min_index = v;
  45.             }
  46.        
  47.         return min_index;
  48.     }
  49.  
  50.    
  51.     public void stampaSoluzione(ArrayList<Integer> dist)
  52.     {
  53.         System.out.println("\n\nVertice   \tDistanza dal nodo sorgente ("+(this.src+1)+")");
  54.         for (int i = 0; i < this.nodi; i++)
  55.             System.out.println( (i+1) + " \t\t " + dist.get(i));
  56.     }
  57.  
  58.     /**
  59.      * Funzione che implementa l'algoritmo di djikstra
  60.      */
  61.     public void dijkstra()
  62.     {
  63.         ArrayList<Integer> dist = new ArrayList<Integer>(this.nodi); // Includerà le distanze dal vertice al vertice sorgente
  64.  
  65.         ArrayList<Boolean> visitato = new ArrayList<Boolean>(this.nodi); // visitato[i] sarò true se ho visitato il vertice, false altrimenti
  66.  
  67.         for (int i = 0; i < this.nodi; i++) {
  68.             dist.add(i,Integer.MAX_VALUE);
  69.             visitato.add(i, false);
  70.         }
  71.  
  72.         //La distanza da un vertice al vertice stesso è 0
  73.         dist.set(this.src,0);
  74.  
  75.      // In questo ciclo trovo il cammino minimo
  76.         for (int count = 0; count < this.nodi - 1; count++)
  77.         {
  78.             // Prendo la distanza minima dei vertici che non ho visitato
  79.             int min = minDistanza(dist, visitato);
  80.  
  81.             //Mi segno che l'ho visitato
  82.             visitato.set(min,true);
  83.            
  84.             //Aggiorno la distanza del vertice adiacente partendo dal vertice che ho preso
  85.             for (int v = 0; v < this.nodi; v++)
  86.             {
  87.                 // Agggiorno la distanza solo se non ho visitato il vertice e se le altre condizioni sono verificate
  88.                 if (!visitato.get(v) && this.mat.get(min).get(v) != 0 && dist.get(min) != Integer.MAX_VALUE && dist.get(min) + this.mat.get(min).get(v) < dist.get(v))
  89.                     dist.set(v, dist.get(min) + this.mat.get(min).get(v));
  90.             }
  91.  
  92.                
  93.         }
  94.  
  95.         stampaSoluzione(dist);
  96.     }
  97.    
  98. }
  99.  
Add Comment
Please, Sign In to add comment