【发布时间】:2011-03-31 23:20:10
【问题描述】:
我知道标题有点乱,但我不知道如何更好地解释它。
我想做的事:
使用在文本文件中找到的图,找到并打印从顶点 A 到顶点 B 的最短路径(最少顶点数)。
注意:使用广度优先搜索,而不是 Dijkstra 的。
我有什么:
一种在图上应用 BFS 的有效算法,但没有实际打印出最短路径的好方法。
我很难将最短路径中的顶点与仅通过算法运行但不在最短路径中的顶点区分开来。
例如:找到 0 到 4 之间的最短路径。 0 连接到 1,2 和 3。1 连接到 4。 我的路径原来是 [0,1,2,3,4] 而不是 [0,1,4]。
我无法找到任何询问相同问题的线程,或任何包含此问题的 BFS 演练,所以我不确定我是否会这样做方式 em> 比现在更难?
编辑:代码供可能感兴趣的人使用(完全不确定我是否要避开圈子?)
编辑 2:改变了我将路径存储到堆栈的方式。
public String findPath(int v, int w) {
Queue<Integer> q = new LinkedList<Integer>();
boolean[] visited = new boolean[g.numVertices()];
q.add(v);
Stack<Integer> path = new Stack<Integer>();
while(q.peek() != null) {
runBFS(q.poll(),w,visited,q,path);
}
return path.toString();
}
private void runBFS(int v, int w, boolean[] visited, Queue<Integer> q, Stack<Integer> path) {
if(visited[v]) {
}
else if(v == w) {
path.add(v);
q.clear();
}
else {
path.add(v);
visited[v] = true;
VertexIterator vi = g.adjacentVertices(v);
while(vi.hasNext()) {
q.add(vi.next());
}
}
}
变量和方法的一些解释:
v = 原点
w = 目标顶点
g = 图
vi = 遍历 v 的邻居的普通迭代器
感谢阅读!
【问题讨论】:
-
你好,能不能发个源代码。
-
您的图形在代码中是如何表示的?你如何避免圈子?有很多这样的问题最好通过发布一些代码来回答......
-
我添加了一些代码。如果有关于图表的任何缺失信息,请告诉我。
-
我想我在这里遗漏了一些东西。一方面,Java 中的
String对象不是不可变的吗?将path更改为runBFS有什么好处? -
你说得对,我的错。但是,我现在已将其从 String 更改为 Stack,并将在代码中进行适当的更改。
标签: java shortest-path breadth-first-search graph-traversal