深度优先搜索之寻找路径

算法思想:数组edgeTo数组记录的值是当前结点,下标为其邻接点(即路径的下一个结点)

public class DepthFirstSearch {
    private boolean[] marked;
    private int[] edgeTo;//从起点到一个顶点的已知路径上的最后一个点
    private final int s;//起点

    public DepthFirstSearch(Graphics G,int s){
        marked = new boolean[G.v()];
        edgeTo = new int[G.v()];
        this.s = s;
        dfs(G,s);
    }

    private void dfs(Graphics G, int v) {
        marked[v] = true;//标记遍历过的顶点
        for(int w:G.adj(v)){
            if(!marked[w]){
                edgeTo[w] = v;
                dfs(G,w);
            }
        }
    }

    public boolean hasPath(int v){
        return marked[v];   
    }

    public void path(int v,Vector vec){
        Stack stack = null;
        int p = v;

        while(p != s){
            stack.push(p);
            p = edgeTo[p];
        }

        vec.clear();
        while(!stack.empty()){
            vec.add(stack.peek());
            stack.pop();
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值