编辑2:这可能有点晚了,但我弄清楚了问题所在,是我的问题。我误解了项目,它要求寻找最大带宽路径而不是最长路径。虽然这两者不同,但直到现在我才知道。因此,在任何带宽路径问题中(无论是最大还是最小),权重都不会累加,路径值由路径中最小的权重确定。可以将其想象为一条管道路径,水流量由路径上最细的管道决定。
编辑1:我解决了PQ问题,但仍然没有起作用。
这是一个作业(我承认),但如果我不提交它,我可能会整门课程挂掉。我们应该修改Dijkstra算法以计算最长简单路径,而不是最短路径。我想不出解决方案。我在互联网上搜索并找到了这个(甚至是同样的问题)。
但是当我运行它时,它会产生不正确的值。我是否遗漏了什么?为什么它甚至不将权重与前一个节点相加?为什么使用min?
关于图的信息: 1.我们随机生成图形,使每个节点连接到大约25%的其他节点。 2.权重为正数。 3.图中有25个节点。
问题说:“路由算法是在图中查找最大带宽路径的算法。它基于使用Max-Heap结构修改Dijkstra算法。”其中是否有任何技巧可以帮助?
这是一个作业(我承认),但如果我不提交它,我可能会整门课程挂掉。我们应该修改Dijkstra算法以计算最长简单路径,而不是最短路径。我想不出解决方案。我在互联网上搜索并找到了这个(甚至是同样的问题)。
但是当我运行它时,它会产生不正确的值。我是否遗漏了什么?为什么它甚至不将权重与前一个节点相加?为什么使用min?
关于图的信息: 1.我们随机生成图形,使每个节点连接到大约25%的其他节点。 2.权重为正数。 3.图中有25个节点。
问题说:“路由算法是在图中查找最大带宽路径的算法。它基于使用Max-Heap结构修改Dijkstra算法。”其中是否有任何技巧可以帮助?
public class MaxDijkstra {
Graph graph;
PriorityQueue<Node> queue;
public MaxDijkstra(Graph graph, Node s){
this.graph = graph;
s.addAttribute("ui.class", "start");
queue = new PriorityQueue<>(new Comparator<Node>(){
@Override
public int compare(Node n1, Node n2) {
if(Utils.getNodeBW(n1) == Utils.getNodeBW(n2)){
return 0;
}else if(Utils.getNodeBW(n1) < Utils.getNodeBW(n2)){
return 1;
}else{
return -1;
}
}
});
// init
for(Node n : graph){
Utils.setNodeBW(n, 0);
}
Utils.setNodeBW(s, Float.POSITIVE_INFINITY);
// add to Q
for(Node n : graph){
queue.add(n);
}
while(!queue.isEmpty()){
Node u = queue.remove();
Iterator<Node> iterator = u.getNeighborNodeIterator();
while(iterator.hasNext()){
Node v = iterator.next();
float min = Float.min(Utils.getNodeBW(u), Utils.getEdgeBW(u.getEdgeBetween(v)));
if(min > Utils.getNodeBW(v)){
Utils.setNodeBW(v, min);
Utils.setPreOfNode(v, u);
}
}
// validate PQ
// I know it is not good, just for debuggin now
// I will implemnt my own PQ later
List<Node> list = new ArrayList<>();
while(!queue.isEmpty()){
Node w = queue.remove();
list.add(w);
}
for(Node w : list){
queue.add(w);
}
}
}
public void printInfo(){
for(Node n : graph){
System.out.println("N="+n.getId()+" D="+Utils.getNodeBW(n)+" pre="+ (Utils.getPreOfNode(n) == null ? "NIL" : Utils.getPreOfNode(n).getId()) );
}
}
/**
* Just to colourise the path
* @param target
*/
public void backtrack(Node target){
target.addAttribute("ui.class", "end");
Node currunt = target;
Node pre = Utils.getPreOfNode(currunt);
while(pre != null){
currunt.getEdgeBetween(pre).addAttribute("ui.class", "route");
currunt = pre;
pre = Utils.getPreOfNode(currunt);
}
}
提前感谢大家。