剑指offer110:所有路径

题目:
给定一个有 n 个节点的有向无环图,用二维数组 graph 表示,请找到所有从 0 到 n-1 的路径并输出(不要求按顺序)。
graph 的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a ),若为空,就是没有下一个节点了。
示例一:
在这里插入图片描述
输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

示例二:
在这里插入图片描述
输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

分析:
题目要求列出从节点0到节点n-1的所有n-1的所有路径,因此深度优先搜索是更合适的选择。
深度优先搜索通常用递归实现,从节点0出发开始搜索,每当搜索到节点i时,先将该节点添加到路径中去,如果该节点正好是节点n-1,那么就找到一条从节点0到节点n-1的路径,如果不是,则从graph[i]找出每个相邻的节点并用同样的方法进行搜索。当从节点i出发能够抵达的所有节点都搜索完毕之后,将回到前一个节点搜索其他与之相邻的节点。在回到前一个节点之前,需要将节点i从路径中删除,这个过程可以用下面的递归代码。
该代码中path记录当前路径中的所有节点,result记录所有已经找到的路径,上诉代码中没有判断一个节点是否已经访问过,在图搜索时通常需要判断一个节点是否已经访问过,这样可以避免反复访问环中的节点,由于该题已经明确图是一个有向无环图,因此没有必要担心重复访问环中的节点
代码:

package com.kuang;

import java.util.LinkedList;
import java.util.List;

public class AllPathsSourceTarget {
    
    
    public static void main(String[] args) {
    
    
        AllPathsSourceTarget allPathsSourceTarget = new AllPathsSourceTarget();
        int[][] graph = {
    
    {
    
    1,2},{
    
    3},{
    
    3},{
    
    }};
        List<List<Integer>> lists = allPathsSourceTarget.allPathsSourceTarget(graph);
        System.out.println(lists);
    }
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
    
    
        List<List<Integer>> result = new LinkedList<>();
        List<Integer> path = new LinkedList<>();
        dfs(0,graph,path,result);
        return result;
    }

    private void dfs(int source, int[][] graph, List<Integer> path, List<List<Integer>> result) {
    
    
        path.add(source);
//        如果该节点正好是节点n-1,那么就找到一条从节点0到节点n-1的路径
        if (source  == graph.length-1){
    
    
//            将路径添加到结果集中
            result.add(new LinkedList<Integer>(path));
        }else {
    
    
            for (int next:graph[source]){
    
    
                dfs(next,graph,path,result);
            }
        }
        //在回到前一个节点之前,需要将节点i从路径中删除
        path.remove(path.size()-1);
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Jiaodaqiaobiluo/article/details/123966586