算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径

- 第 161 篇 -
Date: 2026 - 02- 07
Author: 郑龙浩(仟墨)

2026-02-06 周四

文章目录

1_卡码网98 可达路径

算法DFS

题目描述

给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。

输入描述

第一行包含两个整数 N,M,表示图中拥有 N 个节点,M 条边

后续 M 行,每行包含两个整数 s 和 t,表示图中的 s 节点与 t 节点中有一条路径

输出描述

输出所有的可达路径,路径中所有节点之间空格隔开,每条路径独占一行,存在多条路径,路径输出的顺序可任意。如果不存在任何一条路径,则输出 -1。

注意输出的序列中,最后一个节点后面没有空格! 例如正确的答案是 1 3 5,而不是 1 3 5 , 5后面没有空格!

cpp 复制代码
// Date: 2026-02-06 Author:郑龙浩

// 1_卡码网98 可达路径

// DFS:用邻接矩阵

// 用时: 1h27min

#include "bits/stdc++.h"

using namespace std;

typedef long long ll;

  

vector <vector<ll>> result; // 存放多个path

vector <ll> path; // 存放一条路径

  

// dfs: graph[]是邻接阵,x是当前遍历的节点,n是最后一个节点

void dfs(vector<vector<ll>>& graph, ll x, ll n) {

    // 1 确定终止条件

    if (x == n) { // 如连接到最后一个节点,就将path加入result 且return下

        result.push_back(path);

        return;

    }

    // 2 遍历节点x连接的所有节点

    for (ll i = 1; i <= n; i++) {

        if (graph[x][i] == 1) { // 如x指向i,就继续以i为节点,寻找i连接的下一个节点

            path.push_back(i); // 插入下一个节点

            dfs(graph, i, n); // 查找i连接的点

            path.pop_back(); // 回溯,执行完dfs(graph, i, n)后,i节点的所有的连接节点都找完了,需要退回到前一个指向i的节点去

        }

    }

}

int main(void) {

    ios::sync_with_stdio(0);

    cin.tie(0); cout.tie(0);

    ll N, M, s, t;

    cin >> N >> M;

    vector <vector<ll>> graph(N + 1, vector<ll>(N + 1, 0)); // 邻接矩阵(相连为1,不相连为0)

  

    while (M--) { // 所有的边

        cin >> s >> t;

        graph[s][t] = 1;

    }

    // DFS 深搜

    // 注意:在执行dfs之前,要先在path中存储第一个节点

    path.push_back(1);

    dfs(graph, 1, N);

  

    // 排序结果,按字典序输出(可以不写)

    sort(result.begin(), result.end());

    // 打印result

    // 特容易忘:如果没有任何的路径,就输出-1(注意)

    if (result.size() == 0) {

        cout << -1;

        return 0;

    }

  

    for (auto path : result) {

        ll len = path.size();

        for (ll i = 0; i < len - 1; i++) {

            cout << path[i] << ' ';

        }

        cout << path[len - 1] << '\n'; // 最后一个节点后,没有空格

    }

  
  

    return 0;

}

2_力扣797_所有可能的路径

给你一个有 n 个节点的 有向无环图(DAG) ,请你找出从节点 0 到节点 n-1 的所有路径并输出(不要求按特定顺序

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

算法

cpp 复制代码
// Date: 2026-02-06 Author:郑龙浩

// 1_卡码忘98 可达路径

// DFS:用邻接矩阵

// 用时: 1h27min

#include "bits/stdc++.h"

using namespace std;

typedef long long ll;

  

vector <vector<ll>> result; // 存放多个path

vector <ll> path; // 存放一条路径

  

// dfs: graph[]是邻接阵,x是当前遍历的节点,n是最后一个节点

void dfs(vector<vector<ll>>& graph, ll x, ll n) {

    // 1 确定终止条件

    if (x == n) { // 如连接到最后一个节点,就将path加入result 且return下

        result.push_back(path);

        return;

    }

    // 2 遍历节点x连接的所有节点

    for (ll i = 1; i <= n; i++) {

        if (graph[x][i] == 1) { // 如x指向i,就继续以i为节点,寻找i连接的下一个节点

            path.push_back(i); // 插入下一个节点

            dfs(graph, i, n); // 查找i连接的点

            path.pop_back(); // 回溯,执行完dfs(graph, i, n)后,i节点的所有的连接节点都找完了,需要退回到前一个指向i的节点去

        }

    }

}

int main(void) {

    ios::sync_with_stdio(0);

    cin.tie(0); cout.tie(0);

    ll N, M, s, t;

    cin >> N >> M;

    vector <vector<ll>> graph(N + 1, vector<ll>(N + 1, 0)); // 邻接矩阵(相连为1,不相连为0)

  

    while (M--) { // 所有的边

        cin >> s >> t;

        graph[s][t] = 1;

    }

    // DFS 深搜

    // 注意:在执行dfs之前,要先在path中存储第一个节点

    path.push_back(1);

    dfs(graph, 1, N);

  

    // 排序结果,按字典序输出(可以不写)

    sort(result.begin(), result.end());

    // 打印result

    // 特容易忘:如果没有任何的路径,就输出-1(注意)

    if (result.size() == 0) {

        cout << -1;

        return 0;

    }

  

    for (auto path : result) {

        ll len = path.size();

        for (ll i = 0; i < len - 1; i++) {

            cout << path[i] << ' ';

        }

        cout << path[len - 1] << '\n'; // 最后一个节点后,没有空格

    }

  
  

    return 0;

}
相关推荐
yang)2 小时前
欠采样时的相位倒置问题
算法
历程里程碑2 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
A尘埃2 小时前
物流公司配送路径动态优化(Q-Learning算法)
算法
天若有情6732 小时前
【自研实战】轻量级ASCII字符串加密算法:从设计到落地(防查岗神器版)
网络·c++·算法·安全·数据安全·加密
啊森要自信2 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹3 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事3 小时前
简单模板笔记
数据结构·笔记·算法
YuTaoShao3 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头3 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展