当前位置: 首页 > news >正文

98. 可达路径

目录

题目链接:

题目:

解题思路:

代码:

总结:


题目链接:

98. 可达路径

题目:

解题思路:

dfs基础模版解法,使用递归进行dfs(其实就是回溯),

代码:

import java.util.*;
/*
*Stack Integer ArrayList String StringBuffer peek
*Collections imports LinkedList offer return
*empty polls offerLast pollFirst isEmpty
*List Deque append length HashMap  
*return remove boolean continue charAt
*toString
*/ 
public class Main{static List<List<Integer>> res=new ArrayList<>();static List<Integer> path=new ArrayList<>();public static void main(String[] args){Scanner sc=new Scanner(System.in);int n,m;n=sc.nextInt();m=sc.nextInt();int[][] nums=new int[n+1][n+1];for(int i=0;i<m;i++){int s,t;s=sc.nextInt();t=sc.nextInt();nums[s][t]=1;}path.add(1);dfs(nums,1,n);if(res.isEmpty()) System.out.println(-1);for(int i=0;i<res.size();i++){path=res.get(i);for(int j=0;j<path.size()-1;j++){System.out.print(path.get(j)+" ");}System.out.println(path.get(path.size()-1));}}public static void dfs(int[][] nums,int start,int end){if(start==end){res.add(new ArrayList<>(path));return ;}for(int i=1;i<=end;i++){if(nums[start][i]==1){path.add(i);dfs(nums,i,end);path.remove(path.size()-1);}}}
}

深度解析:基于 DFS 的图中所有路径查找算法一、引言在图论相关的算法问题中,寻找从一个起始节点到目标节点的所有可能路径是一类经典且基础的问题。这类问题在实际场景中有着广泛的应用,比如网络路由规划、交通路径导航、程序执行路径分析等。本文将深入解析一段使用 Java 语言,通过深度优先搜索(DFS)结合回溯法来解决 “寻找从节点 1 到节点 n 的所有路径” 问题的代码。二、问题背景与需求假设我们有一个有向图,图中的节点编号从 1 到 n。我们的任务是找出从起始节点 1 到目标节点 n 的所有可能路径。例如,在一个交通路网中,节点代表不同的地点,有向边代表两地之间的通行方向,我们需要找出从起点到终点的所有可行路线;或者在程序的控制流图中,找出从入口到出口的所有执行路径,用于程序的测试用例生成等。三、代码整体结构与核心思路这段代码主要由主类Main构成,包含两个静态成员变量res和path,以及main方法和dfs方法。核心思路是利用深度优先搜索遍历图的所有可能路径,同时通过回溯法记录和维护当前路径,最终收集所有从节点 1 到节点 n 的有效路径。3.1 成员变量解析static List<List<Integer>> res:这是一个二维的ArrayList,用于存储所有从节点 1 到节点 n 的有效路径。其中每个一维ArrayList代表一条具体的路径。static List<Integer> path:这是一个一维的ArrayList,用于在深度优先搜索过程中,临时记录当前正在探索的路径。3.2 main方法:程序入口与流程控制main方法是程序的入口,负责处理输入、初始化数据结构、调用深度优先搜索方法以及输出结果。java运行public static void main(String[] args){
    Scanner sc=new Scanner(System.in);
    int n,m;
    n=sc.nextInt();
    m=sc.nextInt();
    int[][] nums=new int[n+1][n+1];
    for(int i=0;i<m;i++){
        int s,t;
        s=sc.nextInt();
        t=sc.nextInt();
        nums[s][t]=1;
    }
    path.add(1);
    dfs(nums,1,n);
    if(res.isEmpty()) System.out.println(-1);
    for(int i=0;i<res.size();i++){
        path=res.get(i);
        for(int j=0;j<path.size()-1;j++){
            System.out.print(path.get(j)+" ");
        }
        System.out.println(path.get(path.size()-1));
    }
}
输入处理:使用Scanner类从标准输入读取图的节点数n和边数m。然后读取m条边的信息,构建一个邻接矩阵nums来表示这个有向图。邻接矩阵nums的大小为(n + 1)×(n + 1),这样做是为了方便使用节点编号(从 1 到 n)作为索引,nums[s][t] = 1表示存在一条从节点s到节点t的有向边。初始化路径:在开始深度优先搜索之前,先将起始节点 1 添加到临时路径path中,因为所有路径都是从节点 1 开始的。调用 DFS:调用dfs方法,传入邻接矩阵nums、起始节点 1 和目标节点n,开始深度优先搜索所有可能的路径。结果输出:搜索结束后,检查res是否为空。如果为空,说明没有从节点 1 到节点 n 的路径,输出-1;否则,遍历res中的每一条路径,按照格式输出每条路径的节点,节点之间用空格分隔,最后一个节点单独换行。3.3 dfs方法:深度优先搜索与回溯dfs方法是实现深度优先搜索的核心,通过递归和回溯来探索所有可能的路径。java运行public static void dfs(int[][] nums,int start,int end){
    if(start==end){
        res.add(new ArrayList<>(path));
        return ;
    }
    for(int i=1;i<=end;i++){
        if(nums[start][i]==1){
            path.add(i);
            dfs(nums,i,end);
            path.remove(path.size()-1);
        }
    }
}
终止条件:当当前探索的节点start等于目标节点end时,说明找到了一条从节点 1 到节点n的有效路径。此时,将当前的临时路径path复制一份(使用new ArrayList<>(path),避免后续回溯对结果的影响),添加到结果集res中,然后返回,结束当前递归分支。遍历邻接节点:对于当前节点start,遍历所有可能的邻接节点i(从 1 到end)。如果存在从start到i的有向边(即nums[start][i] == 1),则将节点i添加到临时路径path中,然后递归调用dfs方法,从节点i继续探索路径。回溯操作:递归调用返回后,执行path.remove(path.size() - 1),这是回溯的关键步骤。它将刚刚添加到path中的节点i移除,以便在其他分支的搜索中,能够重新选择其他邻接节点,从而探索出所有可能的路径。四、算法原理:深度优先搜索与回溯法4.1 深度优先搜索(DFS)深度优先搜索是一种图遍历算法,它从起始节点开始,沿着一条路径尽可能深地探索,直到无法继续前进(到达目标节点或没有未访问的邻接节点),然后回溯到上一个节点,选择另一条未探索的路径继续探索。这种 “深度优先,回溯探索” 的方式,非常适合用于寻找所有可能的路径。4.2 回溯法回溯法是一种通过探索所有可能的候选解来找出所有解的算法。如果当前候选解被确认不是一个有效解(或者无法继续延伸为有效解),就回溯到上一个状态,尝试其他候选。在本题中,当沿着某条路径探索到死胡同(无法到达目标节点)时,就会回溯,移除当前路径的最后一个节点,然后尝试其他邻接节点。在代码中,path.add(i)和path.remove(path.size() - 1)这两个操作就是回溯法的体现。path.add(i)将节点i加入当前路径,进行深度探索;path.remove(path.size() - 1)则是在探索完以i为中间节点的所有路径后,将i从当前路径中移除,回到之前的状态,以便探索其他可能的邻接节点。五、代码运行示例5.1 输入示例假设输入如下:plaintext5 5
1 2
1 3
2 4
3 5
4 5
这里表示有 5 个节点,5 条边,边的情况是 1→2、1→3、2→4、3→5、4→5。5.2 运行过程分析起始时,path = [1]。调用dfs(nums, 1, 5),start = 1,不等于end = 5。遍历i从 1 到 5,发现nums[1][2] = 1和nums[1][3] = 1。当i = 2时,path变为[1, 2],调用dfs(nums, 2, 5)。在dfs(nums, 2, 5)中,start = 2,遍历i从 1 到 5,发现nums[2][4] = 1。path变为[1, 2, 4],调用dfs(nums, 4, 5)。在dfs(nums, 4, 5)中,start = 4,遍历i从 1 到 5,发现nums[4][5] = 1。path变为[1, 2, 4, 5],此时start = 5等于end = 5,将[1, 2, 4, 5]添加到res中。回溯,path变为[1, 2, 4],然后继续回溯,path变为[1, 2],再回溯,path变为[1]。当i = 3时,path变为[1, 3],调用dfs(nums, 3, 5)。在dfs(nums, 3, 5)中,start = 3,遍历i从 1 到 5,发现nums[3][5] = 1。path变为[1, 3, 5],此时start = 5等于end = 5,将[1, 3, 5]添加到res中。回溯,path变为[1, 3],再回溯,path变为[1]。5.3 输出结果最终res中包含两条路径[1, 2, 4, 5]和[1, 3, 5],输出如下:plaintext1 2 4 5
1 3 5
六、算法复杂度分析6.1 时间复杂度假设图中有n个节点,每个节点平均有k个邻接节点。在最坏情况下,需要探索所有可能的路径。对于有向无环图(DAG),路径的数量最多为指数级,所以时间复杂度为\(O(k^n)\),其中k是每个节点的平均出度,n是节点数。如果图中存在环,路径数量可能无限多,但在实际问题中,通常会有隐含的路径长度限制,或者题目保证图是有向无环的。6.2 空间复杂度主要的空间开销来自于存储所有路径的res和存储当前路径的path。在最坏情况下,res需要存储\(O(k^n)\)条路径,每条路径平均长度为n,所以空间复杂度为\(O(n \times k^n)\)。七、总结与拓展这段代码通过深度优先搜索和回溯法,高效地解决了 “寻找从节点 1 到节点 n 的所有路径” 的问题。深度优先搜索保证了能探索到图中的每一条可能路径,回溯法则确保了在探索失败时能回到之前的状态,继续探索其他可能。在实际应用中,还可以对该算法进行一些拓展,比如:限制路径长度:如果只需要寻找长度不超过某一值的路径,可以在dfs方法中添加路径长度的判断条件。处理带权图:如果图中的边带有权重,想要寻找权重和满足特定条件的路径,可以修改dfs方法,添加权重和的参数,并在递归过程中进行判断。剪枝优化:如果提前知道某些分支不可能找到有效路径,可以在dfs中添加剪枝条件,减少不必要的搜索,提高算法效率。总之,深度优先搜索结合回溯法是解决图中路径查找问题的有力工具,理解其原理和实现对于解决更复杂的图论问题具有重要的基础作用。

总结:

本文解析了使用Java实现基于DFS的图中所有路径查找算法。代码通过邻接矩阵表示有向图,采用深度优先搜索(DFS)结合回溯法,递归查找从节点1到节点n的所有可能路径。算法核心在于维护当前路径path,遇到终点时记录完整路径到结果集res。文章详细讲解了代码结构、运行流程、时间/空间复杂度(最坏情况O(k^n)),并提供了输入输出示例。该算法适用于路径规划等场景,可通过剪枝、限制路径长度等方式进行优化拓展。

http://www.dtcms.com/a/436356.html

相关文章:

  • 外卖网站 模板wordpress获取分类名称
  • 小米路由器mini做网站郴州市建设网站
  • 保山市住房和建设局网站如何做网站客户端
  • 八戒影视杭州优化公司哪家好
  • 郴州网站设计公司外贸企业网站建设方案
  • 国外产品展示网站源码有赞商城
  • 企业免费招聘人才网站广东企业网站seo哪家好
  • 做网站的素材都在哪里下载做视频大赛推广的网站
  • 车辆年检查询系统官方网站代刷业务网站建设
  • 概念网站源码农村电商网站建设方案
  • 怎么样建网站个人页面模板
  • Pom依赖文件
  • 做程序网站需要什么代码吗重庆网站建设齐重庆零臻科技
  • 安徽网站建设论坛北京专业做网站
  • 淘宝京东网站建设目的哈尔滨专业的建站报价
  • 做网站的都是什么专业毕业的公司网站建设外包流程图
  • 做夹具需要知道的几个网站保定网站电话
  • 公司做企业网站须知赣州网站建设顺企网
  • php 网站模板目前网站建设用哪种语言
  • 河南网站网站制作军事人才招聘网官网2023岗位表
  • 做网站前期构架图成都住建局官网投诉
  • LeetCode 刷题【96. 不同的二叉搜索树】
  • 响应式的网站建设一个多少钱流量平台当建价值高地
  • 万网网站备案流程百度发布平台官网
  • 网站内容页相关性怎么做自助建站网站模板
  • 阜阳 做网站用手机怎样免费做网站
  • 招聘网站建设规划书自己可以建设环保公益网站吗
  • 建设银行河北招聘网站记账公司
  • 免费 网站管理系统360报危险网站
  • 【最新】2025年计算机软件著作权合作开发协议示例文件