无向图的处理算法(三)

793 查看

上一篇讲了从一个顶点到另一个顶点是否存在路径,用的时深度优先搜索。那还有一个重要的问题就是,“从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;
    }
}