vitordelfino

Dijkstra

Apr 30th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.54 KB | None | 0 0
  1. public class Dijkstra {
  2.  
  3.     // Atributos usados na funcao encontrarMenorCaminho
  4.  
  5.     // Lista que guarda os vertices pertencentes ao menor caminho encontrado
  6.     List<Vertice> menorCaminho = new ArrayList<Vertice>();
  7.  
  8.     // Variavel que recebe os vertices pertencentes ao menor caminho
  9.     Vertice verticeCaminho = new Vertice();
  10.  
  11.     // Variavel que guarda o vertice que esta sendo visitado
  12.     Vertice atual = new Vertice();
  13.  
  14.     // Variavel que marca o vizinho do vertice atualmente visitado
  15.     Vertice vizinho = new Vertice();
  16.  
  17.     // Lista dos vertices que ainda nao foram visitados
  18.     List<Vertice> naoVisitados = new ArrayList<Vertice>();
  19.  
  20.     // Algoritmo de Dijkstra
  21.     public List<Vertice> encontrarMenorCaminhoDijkstra(Grafo grafo, Vertice v1,
  22.             Vertice v2) {
  23.  
  24.         // Adiciona a origem na lista do menor caminho
  25.         menorCaminho.add(v1);
  26.  
  27.         // Colocando a distancias iniciais
  28.         for (int i = 0; i < grafo.getVertices().size(); i++) {
  29.  
  30.             // Vertice atual tem distancia zero, e todos os outros,
  31.             // 9999("infinita")
  32.             if (grafo.getVertices().get(i).getDescricao()
  33.                     .equals(v1.getDescricao())) {
  34.  
  35.                 grafo.getVertices().get(i).setDistancia(0);
  36.  
  37.             } else {
  38.                 grafo.getVertices().get(i).setDistancia(9999);
  39.             }
  40.             // Insere o vertice na lista de vertices nao visitados
  41.             this.naoVisitados.add(grafo.getVertices().get(i));
  42.         }
  43.  
  44.         Collections.sort(naoVisitados);
  45.  
  46.         // O algoritmo continua ate que todos os vertices sejam visitados
  47.         while (!this.naoVisitados.isEmpty()) {
  48.  
  49.             // Toma-se sempre o vertice com menor distancia, que eh o primeiro
  50.             // da
  51.             // lista
  52.  
  53.             atual = this.naoVisitados.get(0);
  54.             System.out.println("Pegou esse vertice:  " + atual);
  55.             /*
  56.              * Para cada vizinho (cada aresta), calcula-se a sua possivel
  57.              * distancia, somando a distancia do vertice atual com a da aresta
  58.              * correspondente. Se essa distancia for menor que a distancia do
  59.              * vizinho, esta eh atualizada.
  60.              */
  61.             for (int i = 0; i < atual.getArestas().size(); i++) {
  62.  
  63.                 vizinho = atual.getArestas().get(i).getDestino();
  64.                 System.out.println("Olhando o vizinho de " + atual + ": "
  65.                         + vizinho);
  66.                 if (!vizinho.verificarVisita()) {
  67.  
  68.                     // Comparando a distância do vizinho com a possível
  69.                     // distância
  70.                     if (vizinho.getDistancia() > (atual.getDistancia() + atual
  71.                             .getArestas().get(i).getPeso())) {
  72.  
  73.                         vizinho.setDistancia(atual.getDistancia()
  74.                                 + atual.getArestas().get(i).getPeso());
  75.                         vizinho.setPai(atual);
  76.  
  77.                         /*
  78.                          * Se o vizinho eh o vertice procurado, e foi feita uma
  79.                          * mudanca na distancia, a lista com o menor caminho
  80.                          * anterior eh apagada, pois existe um caminho menor
  81.                          * vertices pais, ateh o vertice origem.
  82.                          */
  83.                         if (vizinho == v2) {
  84.                             menorCaminho.clear();
  85.                             verticeCaminho = vizinho;
  86.                             menorCaminho.add(vizinho);
  87.                             while (verticeCaminho.getPai() != null) {
  88.  
  89.                                 menorCaminho.add(verticeCaminho.getPai());
  90.                                 verticeCaminho = verticeCaminho.getPai();
  91.  
  92.                             }
  93.                             // Ordena a lista do menor caminho, para que ele
  94.                             // seja exibido da origem ao destino.
  95.                             Collections.sort(menorCaminho);
  96.                         }
  97.                     }
  98.                 }
  99.  
  100.             }
  101.             // Marca o vertice atual como visitado e o retira da lista de nao
  102.             // visitados
  103.             atual.visitar();
  104.             this.naoVisitados.remove(atual);
  105.             /*
  106.              * Ordena a lista, para que o vertice com menor distancia fique na
  107.              * primeira posicao
  108.              */
  109.  
  110.             Collections.sort(naoVisitados);
  111.             System.out.println("Nao foram visitados ainda:"+naoVisitados);
  112.  
  113.         }
  114.         return menorCaminho;
  115.     }
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment