KamaCoder 98. 所有可到达路径 + LC 797. All Paths From Source to Target

题目要求

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

输入描述

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

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

输出描述

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

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

输入示例

5 5
1 3
3 5
1 2
2 4
4 5

 

输出示例

1 3 5
1 2 4 5

思路 

首先要知道图应该怎么存储,然后是通过搜索的方法找出所有的边。

图的存储
邻接矩阵

本题有n个节点,节点标号从1开始,为了对其标号和下标,我们申请n+1*n+1这么大的二维数组。

vector<vector<int>> graph(n + 1, vector<int>(n + 1, 0));

输入m个边,构造方式如下:

while(m--) {cin >> s >> t;// 使用邻接矩阵,1表示节点s指向节点tgraph[s][t] = 1;
}
邻接表

采用数组+链表的形式来表示。

vector<list<int>> graph(n + 1); // 邻接表,list为C++里的链表,初始时没有申请空间,随用随取// 输入m个边
while(m--) {cin >> s >> t;// 使用邻接表,表示s —> t是相连的graph[s].push_back(t);
}
深度优先搜索

深搜三部曲:1.确认递归函数、参数, 2.确认终止条件,3.处理目前搜索节点出发的路径

1. 确认递归函数、参数

首先dfs函数一定要存一个图,用来遍历,需要存一个目前我们遍历的节点,定义为x。

还需要存储终点位置n,当x==n时表示到达了终点。

至于 单一路径 和 路径集合(答案)可以放在全局变量。

vector<vector<int>> result; // 收集符合条件的路径
vector<int> path; // 0节点到终点的路径
// x:目前遍历的节点
// graph:存当前的图
// n:终点
void dfs (const vector<vector<int>>& graph, int x, int n) {

 2. 确认终止条件

当目前遍历的节点为最后一个节点n的时候,就找到了一条从出发点到终止点的路径。

// 当前遍历的节点x,到达节点n
if (x == n) { // 找到符合条件的一条路径result.push_back(path);return;
}

3. 处理目前搜索节点出发的路径

接下来时走当前遍历节点x的下一个节点。

// 找到节点x指向哪些节点
for (int i = 1; i <= n; ++i) { // 遍历节点x链接的所有节点if (graph[x][i] == 1) { // 找到x指向的节点就是i// 将x所指向的节点加入到单一路径中path.push_back(i);// 进入下一层递归dfs(graph, i, n);// 回溯过程,撤销本次添加节点的操作path.pop_back();}
}
打印结果

注意结尾没有空格

// 输出结果
if (result.size() == 0) cout << -1 << endl;
for (const vector<int> &pa : result) {for (int i = 0; i < pa.size() - 1; ++i) { // 打印到倒数第二个cout << pa[i] << " ";}cout << pa[pa.size() - 1] << endl;
}

本题代码

C++邻接矩阵写法
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> result;
vector<int> path;void dfs(const vector<vector<int>>& graph, int x, int n) {if (x == n) {result.push_back(path);return;}for (int i = 1; i <= n; ++i) {if (graph[x][i] == 1) {path.push_back(i);dfs(graph, i, n);path.pop_back();}}
}int main() {int n, m, s, t;cin >> n >> m;vector<vector<int>> graph(n + 1, vector<int>(n + 1, 0));for (int i = 1; i <= m; ++i) {cin >> s >> t;graph[s][t] = 1;}path.push_back(1); // 注意:无论什么路径都是从节点0(1)出发dfs(graph, 1, n);if (result.size() == 0) cout << -1 << endl;for (const vector<int> &pa : result) {for (int i = 0; i < pa.size() - 1; ++i) {cout << pa[i] << " ";}cout << pa[pa.size() - 1] << endl;}
}
C++邻接表写法
#include <iostream>
#include <vector>
#include <list>
using namespace std;
vector<vector<int>> result;
vector<int> path;void dfs(const vector<list<int>>& graph, int x, int n) {if (x == n) {result.push_back(path);return;}for (int i : graph[x]) {path.push_back(i);dfs(graph, i, n);path.pop_back();}
}int main() {int n, m, s, t;cin >> n >> m;vector<list<int>> graph(n + 1);while (m--) {cin >> s >> t;graph[s].push_back(t);}path.push_back(1); // 注意:无论什么路径都是从节点0(1)出发dfs(graph, 1, n);if (result.size() == 0) cout << -1 << endl;for (const vector<int> &pa : result) {for (int i = 0; i < pa.size() - 1; ++i) {cout << pa[i] << " ";}cout << pa[pa.size() - 1] << endl;}
}
Python邻接矩阵写法
def dfs(graph, x, n, path, result):if x == n:result.append(path.copy())returnfor i in range(1, n+1):if graph[x][i] == 1:path.append(i)dfs(graph, i, n, path, result)path.pop()def main():n, m = map(int, input().split())graph = [[0] * (n+1) for _ in range(n+1)]for _ in range(m):s, t = map(int, input().split())graph[s][t] = 1result = []dfs(graph, 1, n, [1], result)if not result:print(-1)else:for path in result:print(' '.join(map(str, path)))if __name__ == "__main__":main()
Python邻接表写法(注意collections.defaultdict的使用)
from collections import defaultdictresult = []
path = []def dfs(graph, x, n, path, result):if x == n:result.append(path.copy())returnfor i in graph[x]:path.append(i)dfs(graph, i, n, path, result)path.pop()def main():n, m = map(int, input().split())graph = defaultdict(list)for _ in range(m):s, t = map(int, input().split())graph[s].append(t)result = []dfs(graph, 1, n, [1], result)if not result:print(-1)else:for pa in result:print(' '.join(map(str, pa)))if __name__ == "__main__":main()

Leetcode 797. All Paths From Source to Target  

题目也是一道有向无环的图的求所有起点到终点的路径问题,区别在于不需要调整输入输出。(题目中的图已经给出了邻接表的存储形式)

C++
class Solution {
public:vector<int> path;vector<vector<int>> result;void dfs(const vector<vector<int>>& graph, int x, int n) {if (x == n) {result.push_back(path);return;}for (int i : graph[x]) {path.push_back(i);dfs(graph, i, n);path.pop_back();}}vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {path.push_back(0);dfs(graph, 0, graph.size() - 1);return result;    }
};
Python (注意列表是引用类型,后续修改会影响已经添加的路径,所以要用.copy())
class Solution:def dfs(self, graph, x, n, path, result):if (x == n):result.append(path.copy())returnfor i in graph[x]:path.append(i)self.dfs(graph, i, n, path, result)path.pop()def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:path = []result = []path.append(0)self.dfs(graph, 0, len(graph) - 1, path, result)return result

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384346.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctfshow-web入门-php特性(web137-web141)

目录 1、web137 2、web138 3、web139 4、web140 5、web141 1、web137 直接调用 ctfshow 这个类下的 getFlag 函数&#xff0c;payload&#xff1a; ctfshowctfshow::getFlag 查看源码&#xff1a; 拿到 flag&#xff1a;ctfshow{dd387d95-6fbe-4703-8ec5-9c8f9baf2bb5} 在…

每天一个设计模式之职责链模式(第一天)

特别感谢刘伟老师&#xff0c;看他的书我学到了很多东西&#xff0c;从今天开始我要开始更新啦&#xff01; 在csdn个人博客来总结知识&#xff0c;把他们变成自己的能力。 对三&#xff0c;要不起&#xff0c;张三李四王五几个人在玩斗地主&#xff0c;过过过&#xff0c;一…

杰发科技Bootloader(1)—— Keil配置地址

IAP方式 BootLoader方式 UDSBoot方式 AC7801的地址分配 用户空间的的地址从8000000开始分配&#xff0c;大小是64页&#xff0c;即128K。 RAM地址从20000000开始 基于UDSboot调试-Boot 烧录Boot之后&#xff0c;ATClinkTool无法连接 用keil查看内存&#xff0c;地址到8005388…

vscode 调试web后端

1、调试环境配置 一、安装python环境管理器 其中要先在vscode选择对应的python环境&#xff0c;最方便的是按照环境管理器后从中选择。其中在【externsions】里面安装python即可。 如下&#xff1a; 二、编写launch.json文件 其中如下&#xff1a; {// Use IntelliSense …

oracle中存储过程的写法

存储过程常规语法&#xff1a; 实际业务例子&#xff1a; CREATE OR REPLACE TRIGGER "TRI_B00_02_ONLY_GUID" BEFORE/AFTER INSERT OR UPDATE OR DELETE ON B00_02 FOR EACH ROW declare t_guid varchar2(300) : ; --GUID t_cnt int : 0; BEGIN t_guid : :NEW…

快速入门C#设计模式【2】结构型模式

结构型模式 适配器模式 (Adapter)桥接模式 (Bridge)组合模式 (Composite)装饰模式 (Decorator)外观模式 (Facade)享元模式 (Flyweight)代理模式 (Proxy) 适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计…

Pytorch深度学习实践(5)逻辑回归

逻辑回归 逻辑回归主要是解决分类问题 回归任务&#xff1a;结果是一个连续的实数分类任务&#xff1a;结果是一个离散的值 分类任务不能直接使用回归去预测&#xff0c;比如在手写识别中&#xff08;识别手写 0 − − 9 0 -- 9 0−−9&#xff09;&#xff0c;因为各个类别…

CentOS7下操作iptables防火墙和firewalld防火墙

CentOS7下操作iptables防火墙和firewalld防火墙 &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、…

【OpenCV C++20 学习笔记】调节图片对比度和亮度(像素变换)

调节图片对比度和亮度&#xff08;像素变换&#xff09; 原理像素变换亮度和对比度调整 代码实现更简便的方法结果展示 γ \gamma γ校正及其实操案例线性变换的缺点 γ \gamma γ校正低曝光图片矫正案例代码实现 原理 关于OpenCV的配置和基础用法&#xff0c;请参阅本专栏的其…

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据 &#x1f4da;MT6816相关资料&#xff08;来自商家的相关资料&#xff09;&#xff1a; 资料&#xff1a;https://pan.baidu.com/s/1CAbdLBRi2dmL4D7cFve1XA?pwd8888 提取码&#xff1a;8888&#x1f4cd;驱动代码编写&…

FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 加入课程 我们先看下加入课程 1.是否登录 2.课程是否存在 3.是否已经存在 4.添加 首先实现逻辑 def get_student_course(db: Session, course: int…

如何开启或者关闭 Windows 安全登录?

什么是安全登录 什么是 Windows 安全登录呢&#xff1f;安全登录是 Windows 附加的一个组件&#xff0c;它可以在用户需要登录的之前先将登录界面隐藏&#xff0c;只有当用户按下 CtrlAltDelete 之后才出现登录屏幕&#xff0c;这样可以防止那些模拟登录界面的程序获取密码信息…

【9.PIE-Engine案例——加载Terra星全球500m植被指数16天合成产品(MOD13A1 V61)数据集】

加载Terra星全球500m植被指数16天合成产品(MOD13A1 V61)数据集 原始路径 欢迎大家登录航天宏图官网查看本案例原始来源 最终结果 具体代码 /*** File : MOD13A1* Time : 2020/7/21* Author : piesat* Version : 1.0* Contact : 400-890-0662* License : …

Interesting bug caused by getattr

题意&#xff1a;由 getattr 引起的有趣的 bug 问题背景&#xff1a; I try to train 8 CNN models with the same structures simultaneously. After training a model on a batch, I need to synchronize the weights of the feature extraction layers in other 7 models. …

WARNING: Ignoring invalid distribution -ip警告信息如何去掉?

查看已安装依赖列表的时候&#xff0c;出现了很多警告信息&#xff0c;如何去掉呢&#xff1f; 解决办法 打开这个路径&#xff1a;d:\software\python\python39\lib\site-packages 这种波浪线开头的&#xff0c;我们将它删除掉,就可以了。

Ubuntu设置网络

进入网络配置文件夹 cd /etc/netplan 使用 vim 打开下的配置文件 打开后的配置 配置说明&#xff1a; network:# 网络配置部分ethernets:# 配置名为ens33的以太网接口ens33:addresses:# 为ens33接口分配IP地址192.168.220.30&#xff0c;子网掩码为24位- 192.168.220.30/24n…

VS2019报错:找不到导入的项目,请确认import声明

解决办法 找到项目的.vcxproj文件 用记事本打开后使用ctrlF搜索import 发现import Project后面的.props文件路径不对&#xff0c;将路径改为相对路径 保存后重新加载项目&#xff0c;即可生成成功

AI发展下的伦理挑战:构建未来科技的道德框架

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;我们正处在一个前所未有的科技变革时代。AI不仅在医疗、教育、金融、交通等领域展现出巨大的应用潜力&#xff0c;也在日常生活中扮演着越来越重要的角色。然而&#xff0c;这一技术的迅猛进步也带来…

git实践汇总【配置+日常使用+问题解决】

**最初配置步骤&#xff1a;** git config --global user.name "yournemae" git config --global user.email "yourmail" git config -l ssh-keygen -t rsa -C “xxx.xxxx.EXTcccc.com” git config --global ssh.variant ssh $ git clone git仓库路径 git…

云盘高速检测的秘密:密封圈外观检测全解析!

密封圈是一种用于填塞、隔离或密封两个相互连接部件之间空隙的圆形密封装置。密封圈通常由橡胶、塑料、金属等材料制成&#xff0c;具有弹性并能在压力作用下填充间隙&#xff0c;防止液体、气体或固体物质泄漏。 密封圈可根据具体应用选择不同材料&#xff0c;如橡胶密封圈适…