# File lib/graphviz/theory.rb, line 80
    def moore_dijkstra( dep, arv )
      dep = @graph.get_node(dep) unless dep.kind_of?(GraphViz::Node)
      arv = @graph.get_node(arv) unless arv.kind_of?(GraphViz::Node)
      
      m = distance_matrix
      n = @graph.node_count
      # Table des sommets à choisir
      c = [dep.index]
      # Table des distances
      d = []
      d[dep.index] = 0
      
      # Table des predecesseurs
      pred = []
      
      @graph.each_node do |name, k|
        if k != dep
          d[k.index] = m[dep.index+1,k.index+1]
          pred[k.index] = dep
        end
      end
      
      while c.size < n
        # trouver y tel que d[y] = min{d[k];  k sommet tel que k n'appartient pas à c}
        mini = 1.0/0.0
        y = nil
        @graph.each_node do |name, k|
          next if c.include?(k.index)
          if d[k.index] < mini
            mini = d[k.index]
            y = k
          end
        end
        
        # si ce minimum est ∞ alors sortir de la boucle fin si
        break unless mini.to_f.infinite?.nil?
        
        c << y.index
        @graph.each_node do |name, k|
          next if c.include?(k.index)
          if d[k.index] > d[y.index] + m[y.index+1,k.index+1]
            d[k.index] = d[y.index] + m[y.index+1,k.index+1]
            pred[k.index] = y
          end
        end
      end
      
      # Construction du chemin le plus court
      ch = []
      k = arv
      while k.index != dep.index
        ch.unshift(k.id)
        k = pred[k.index]
      end
      ch.unshift(dep.id)
      
      if d[arv.index].to_f.infinite?
        return nil
      else
        return( { 
          :path => ch,
          :distance => d[arv.index]
        } )
      end
    end