gpt4 book ai didi

java - 使用优先级队列的 Dijkstra 算法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:59:00 24 4
gpt4 key购买 nike

因此,我尝试使用 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]语句有效。请帮忙。

最佳答案

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

您要么需要:

  1. 在您的 Node 类中实现 compareTo
  2. 创建一个比较器,根据优先级比较您的节点(对于 Dijkstra,优先级 = 距起点的距离)

您显示的第二个代码使用 long 的高 32 位来存储优先级,从而使自然顺序反射(reflect)距开始的距离。

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

关于java - 使用优先级队列的 Dijkstra 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30936672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com