我如何使用java中内置的优先级队列来读入和排序图的顶点,最终在每次迭代时删除最小边?
答案 0 :(得分:0)
首先,为优先级队列创建一个比较器:
class MinHeapComparator implements Comparator<Integer> {
@Override
public int compare(Integer one, Integer two) {
return mDistances[one] - mDistances[two];//...
}
}
这是我写的最短路径算法。 mDistance是从源到顶点的距离。您可以修改比较器以比较您喜欢的方式。
从比较器的文档:“比较它的两个参数的顺序。当第一个参数小于,等于或大于第二个参数时,返回一个负整数,零或一个正整数。”
此处填写完整文档:http://download.oracle.com/javase/1.5.0/docs/api/java/util/Comparator.html
其次,将项目添加到优先级队列。我通常使用包含顶点对象的数组构建一个图形,每个对象包含其相邻顶点的列表。所以在我的情况下,我只是将索引添加到优先级队列以表示顶点。然后,比较器可以包含逻辑以对顶点执行任何操作。 PriorityQueue.add()添加项目。
第三,使用比较器实例化优先级队列:
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(numberItems, new MinHeapComparator());
第四,调用PriorityQueue.poll()来提取堆上的顶级项。您的比较器用于确定堆顶部的项目。