Dijkstra的算法使用优先级队列

时间:2015-06-19 11:09:40

标签: java algorithm

所以我尝试使用java中的优先级队列数据结构来实现Dijkstra算法。由于java中的可比运算符无法比较两个变量,因此我需要修改其Comparator。我该如何修改它?

 while(!Q.isEmpty()){
         int index = Q.peek().edge;
         long d = Q.peek().dis;
         Q.remove();

         if(d!=D[index]) continue; // HERE I AM CHECKING IF IT ALREADY PROCEEDED OR NOT

         for(int i=0;i<maps[index].size();i++){
               int e = maps[index].get(i).edge;
                d =  maps[index].get(i).dis;
                if(D[e]>D[index]+d){
                    D[e]= D[index]+d;
                    Q.add(new Node(e,D[e])); // NEED TO MODIFY
                }
         }
     }



然后我遇到了这段代码:

 while (!q.isEmpty()) {
      long cur = q.remove();
      int curu = (int) cur;
      if (cur >>> 32 != prio[curu])
        continue;
      for (Edge e : edges[curu]) {
        int v = e.t;
        int nprio = prio[curu] + e.cost;
        if (prio[v] > nprio) {
          prio[v] = nprio;
          pred[v] = curu;
          q.add(((long) nprio << 32) + v);
        }

q.add(((long) nprio << 32) + v);cur >>> 32 != prio[curu]语句的工作原理。请嘻嘻。

1 个答案:

答案 0 :(得分:1)

如果没有给出比较器,Java的Priorityqueue会根据自然顺序排序。

您需要:

  1. 在Node类中实现compareTo
  2. 创建一个Comparator,根据优先级比较您的节点(优先级= Dijkstra的起点距离)
  3. 您显示的第二个代码使用long的高32位来存储优先级,从而使自然顺序反映从开始的距离。

    基本上,代码与您的代码完全相同,不同之处在于数据结构。你使用一个类,第二个代码使用long来嵌入两个整数(节点id和距离/优先级)。