上一篇讲了从一个顶点到另一个顶点是否存在路径,用的时深度优先搜索。那还有一个重要的问题就是,“从s到v是否存在一条路径,如果有找出其中最短的那条。”最短路径问题
当然这路考虑的是每条边的都是权值为1的情况。
解决这个问题的算法就是广度优先搜索算法
下面给出其实现代码,其中的使用了一个队列用来保存需要遍历的顶点。其实很上一篇中的代码结构差不多,只不过遍历的顶点是依次从队列中取出的
package Graph;
import java.util.Stack;
import Queue.Queue;
public class BreadthFirstPaths {
private boolean[] marked;
private int[] edgeTo;
private final int s;
public BreadthFirstPaths(Graph G,int s)
{
marked = new boolean[G.V()];
edgeTo = new int[G.V()];
this.s = s;
bfs(G,s);
}
private void bfs(Graph G,int s)
{
Queue<Integer> queue = new Queue<Integer>();
marked[s] = true;
queue.enqueue(s);
while(!queue.isEmpty())
{
int v = queue.dequeue();//从队列中删除改顶点
for(int w:G.adj(v))//对该顶点相邻的所有顶点进行遍历,标记为访问过,同时加入队列
{
edgeTo[w] = v;
marked[w] = true;
queue.enqueue(w);
}
}
}
public boolean hasPathTo(int v){
return marked[v];
}
public Iterable<Integer> pathTo(int v)
{
Stack<Integer> path = new Stack<Integer>();
while(edgeTo[v] != s)//同上一篇,通过该数组往上回溯
{
path.push(v);
v = edgeTo[v];
}
path.push(s);
return path;
}
}