2011-04-11 196 views
0

如何使用java内置的优先级队列来读入和排序图的顶点,最终在每次迭代中删除最小边?Java优先级队列

+2

SO上的通常程序是显示您尝试过的内容,并询问您不明白的某个具体问题。尝试发布一些代码以显示迄今为止所做的工作。否则,你会得到积极评价,问题可能会被视为“不是真正的问题”。 – 2011-04-11 03:28:04

回答

0

首先,创建为优先级队列比较:

class MinHeapComparator implements Comparator<Integer> { 
    @Override 
    public int compare(Integer one, Integer two) { 
    return mDistances[one] - mDistances[two];//... 
    } 
    } 

这是最短路径算法我写的。 mDistances是从源到顶点的距离。你可以修改比较器来比较你喜欢的方式。

从比较器的文档:“比较它的两个参数的顺序。返回一个负整数,零或一个正整数,因为第一个参数小于,等于或大于第二个参数。

完整的文档在这里: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()以提取关于堆顶部的项目。您的比较器用于确定堆顶部的项目。

+0

谢谢。你也可以将项目添加到优先级队列,然后运行一个for循环来比较它们并删除最小边缘? – kachilous 2011-04-12 02:19:49

+0

如果您设置比较器以比较边权重,则在循环中调用poll()方法将在每次迭代中删除最小边。你在执行什么算法?图中的最小生成树? – 2011-04-12 03:10:22

+0

是的,我必须最终找到mst,我也必须使用不相交的集合数据结构 – kachilous 2011-04-12 04:12:56