我有一个任务,我需要构建一个简单的无向图,计算两点之间的路径,并计算结果路径的容量。
我已经进行了容量计算。并且路径打印输出显示也可以找到两点之间的路径,但是我无法摆脱导致死胡同的边缘而不会完全破坏我的代码。我已经尝试过从死胡同中反弹,但到目前为止我还没有工作过。使用多边形顶点的任何路径当前都显示连接到该顶点的所有边,无论该点是在路径的中间还是设置为开始/结束。基本上,它涵盖了给定点之间的所有边缘,甚至是多余的边缘。
到目前为止,我的代码如下。我试图从路径中删除死端边缘,但仍然存在。
任何人都可以帮我解决这个问题吗?
public Queue<Edge> SearchPaths(Vertex x, Vertex eelmine) {
if(visited.isEmpty())
lopp = x; // ?? start = x; ??
if(visited.indexOf(x) > -1)
return null;
if(x.isEquals(lopp)) {
Edge serv = x.leiaServ(eelmine);
if(serv != null)
rajad.add(serv);
}
Edge serv = x.first;
while (serv != null) {
if(visited.indexOf(serv.target) == -1)
if(serv != null)
rajad.add(serv);
serv = serv.next; // ?? serv += serv.next
}
visited.add(x);
// otsi uuest tipust järgmine serv
if(visited.indexOf(x.first.target) == -1) {
Vertex jarg = x.first.target;
Edge uusserv = jarg.leiaServ(x);
if(uusserv != null)
rajad.add(uusserv);
SearchPaths(jarg, x);
/* "dead-end edges" .. not correct, breaks code
// nt. x=C, jarg=D, D != lopp ... jarg.jarg == C (C-D-C)
if(jarg!=lopp && visited.indexOf(jarg.first.target) != -1)
jarg.equals(x);
// x=C, jarg=E, E == lopp ... x == jarg
// x=C, jarg=A, A != lopp ... jarg.jarg == B (C-A-B)
if(jarg!=lopp && visited.indexOf(jarg.first.target) == -1) {
jarg.leiaServ(x);
rajad.add(serv);
x.equals(jarg); // liiguta x edasi
SearchPaths(jarg, x);
}*/
}
return rajad;
}
} // Vertex ehk Tipp
答案 0 :(得分:3)
如果您使用优先级队列实现它,请参阅Djikstra's algorithm,您只需要在到达死胡同的路径上加上“无限”权重,就不会再次访问它。
“min”优先级队列是一个数据结构,用于弹出附加权重最小的元素。因此,当您遍历时,您将为每次遍历构建队列(通过步行到节点的邻居)。所以如果你到达了一个节点:
然后你只需要在路径上放置最大重量。在Java中,您可以int
使用Integer.MAX_VALUE
,long
使用Long.MAX_VALUE
。