我知道标题有点乱,但我不知道如何更好地解释。
我的目标:
从文本文件中找到一张图,使用广度优先搜索算法,找到并打印出从顶点A到顶点B的最短路径(最少的顶点数)。
注意:不使用Dijkstra算法。
我已经得到的:
一个应用BFS算法的工作算法,但没有很好的方法来实际打印出最短路径。
我很难区分最短路径中的顶点和仅仅是通过算法运行的顶点,但不在最短路径中的顶点。
例如:找到0和4之间的最短路径。0连接到1、2和3。1连接到4。我的路径变成了[0,1,2,3,4],而不是[0,1,4]。
我还没有找到任何问同样问题的线程,或者包括这个问题的BFS的步骤,所以我不确定是否把它想得太难了?
编辑:代码供那些可能感兴趣的人使用(不确定是否避免了循环?)
编辑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的邻居
谢谢阅读!
String
对象不可变,改变runBFS
中的path
有什么好处呢? - thkala