DFS路径查找


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;

/**
 * @author ming
 * @create 2022/6/10
 * @description:
 */
public class DepthFirstPaths {
    private boolean [] marked;
    //起点
    private int s;
    //索引代表顶点,值代表从起点s到当前顶点路径上最后一个顶点
    private int[]  edgeTo;

    public DepthFirstPaths(Graph g,int s) {
        //初始化mared数组
        this.marked = new boolean[g.v()];
        //初始化s起点
        this.s = s;
        //初始化edge
        this.edgeTo  = new int[g.v()];
        dfs(g,s);
    }

    private void dfs(Graph g, int v) {
        //把v标识已搜索
        marked[v] = true;
        for (Integer w :g.adj(v)){
            if(!marked[w]){
                edgeTo[w] =  v;//到达顶点路径w,最后一个顶点时v
                dfs(g,w);
            }
        }
    }
    //判断起点到顶点v是否有路径
    public boolean hasPathTo(int v){
        return marked[v];
    }
    public Stack<Integer> pathTo(int v){
        if(!hasPathTo(v)){
            return null;
        }
        Stack<Integer> stack = new Stack<>();
        stack.push(v);
        int temp = edgeTo[v];
        while(temp!=s){
            stack.push(temp);
            temp = edgeTo[temp];
        }
        //放起点到栈中
        stack.push(s);
        return stack;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(DepthFirstPaths.class.getClassLoader().getResourceAsStream("traffic_project.txt")));
        Graph graph = new Graph(Integer.parseInt(reader.readLine()));
        int length = Integer.parseInt(reader.readLine());
        for (int i = 0; i < length; i++) {
            String[] str = reader.readLine().split(" ");
            graph.addEdge(Integer.parseInt(str[0]),Integer.parseInt(str[1]));
        }
        DepthFirstPaths depthFirstPaths = new DepthFirstPaths(graph, 0);
        Stack<Integer> stack = depthFirstPaths.pathTo(4);
        while(!stack.isEmpty()){
            Integer pop = stack.pop();
            System.out.print(pop+" ");
        }
    }
    /**
     * 6
     * 8
     * 0 2
     * 0 1
     * 2 1
     * 2 3
     * 2 4
     * 3 5
     * 3 4
     * 0 5
     */
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值