代码随想录-算法训练营-番外(图论01:图论理论基础,所有可到达的路径)

bash 复制代码
day01 图论part01 
今日任务:图论理论基础/所有可到达的路径
代码随想录图论视频部分还没更新
https://programmercarl.com/kamacoder/图论理论基础.html#图的基本概念

day01

所有可达路径

邻接矩阵

复制代码
 import java.util.Scanner;
 import java.util.List;
 import java.util.ArrayList;
 ​
 public class Main{
     static List<List<Integer>> result = new ArrayList<>();
     static List<Integer> path = new ArrayList<>();
     
     public static void main(String[] args){
         Scanner sc = new Scanner(System.in);
         int n = sc.nextInt();
         int m = sc.nextInt();
         int[][] graph = new int[n + 1][n + 1];
         for(int i = 0; i < m; i++){
             graph[sc.nextInt()][sc.nextInt()] = 1;
         }
         path.add(1); //先加一个节点
         dfs(graph, 1, n); 
         if (result.isEmpty()) System.out.println(-1);
         
         for(List<Integer> pa : result){
           for (int i = 0; i < pa.size() - 1; i++) {
                 System.out.print(pa.get(i) + " ");
             }
             System.out.println(pa.get(pa.size() - 1));
         } 
     }
     
     private static void dfs(int[][] graph, int x, int n){//n就是结束节点
         if(x == n){
             result.add(new ArrayList(path));
             return;
         }
         for(int i = 1; i <= n; i++){
             if (graph[x][i] == 1) { 
                 path.add(i); 
                 dfs(graph, i, n); 
                 path.remove(path.size() - 1); 
             }
         }
         return;
     }
 }

邻接表

复制代码
 //感觉graph不用LinkedList而是直接用ArrayList也可以,因为这个场景下不涉及什么增删改而基本都是访问
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Scanner;
 ​
 public class Main {
     static List<List<Integer>> result = new ArrayList<>(); // 收集符合条件的路径
     static List<Integer> path = new ArrayList<>(); // 1节点到终点的路径
 ​
     public static void dfs(List<LinkedList<Integer>> graph, int x, int n) {
         if (x == n) { // 找到符合条件的一条路径
             result.add(new ArrayList<>(path));
             return;
         }
         for (int i : graph.get(x)) { // 找到 x指向的节点
             path.add(i); // 遍历到的节点加入到路径中来
             dfs(graph, i, n); // 进入下一层递归
             path.remove(path.size() - 1); // 回溯,撤销本节点
         }
     }
 ​
     public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
         int n = scanner.nextInt();
         int m = scanner.nextInt();
 ​
         // 节点编号从1到n,所以申请 n+1 这么大的数组
         List<LinkedList<Integer>> graph = new ArrayList<>();
         for (int i = 0; i <= n; i++) {
             graph.add(new LinkedList<>());
         }
 ​
         while (m-- > 0) {
             int s = scanner.nextInt();
             int t = scanner.nextInt();
             // 使用邻接表表示 s -> t 是相连的
             graph.get(s).add(t);
         }
 ​
         path.add(1); // 无论什么路径已经是从1节点出发
         dfs(graph, 1, n); // 开始遍历
 ​
         // 输出结果
         if (result.isEmpty()) System.out.println(-1);
         for (List<Integer> pa : result) {
             for (int i = 0; i < pa.size() - 1; i++) {
                 System.out.print(pa.get(i) + " ");
             }
             System.out.println(pa.get(pa.size() - 1));
         }
     }
 }

感谢大佬分享:

代码随想录算法训练营第五十天|Day50 图论_本关任务:创建邻接表存储的无向图,并输出图的邻接表。-CSDN博客

相关推荐
古法老登瞎折腾1 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
飞Link1 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
智能运维指南2 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks2 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设3 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都3 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵3 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
一去不复返的通信er3 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
白山编程大哥3 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list