搜索与图论:所有可达路径(DFS算法)

搜索与图论:所有可达路径(DFS算法)

    • 题目描述
    • 参考代码
      • 邻接表方法
      • 邻接矩阵方法

题目描述

题目描述
给定一个有 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

参考代码

邻接表方法

#include <iostream>
#include <cstring>
#include <vector>using namespace std;const int N = 510;      // 边数int n, m;
int h[N], e[N], ne[N], idx;
vector<int> path;
bool flag;              // 用于标记是否存在路径void add(int a, int b)
{e[idx] = b; ne[idx] = h[a]; h[a] = idx; idx++;
}void dfs(int u)
{// 如果到达了终点,输出完整路径if (u == n){int len = path.size();  // 路径的长度for (int i = 0; i < len - 1; i++) printf("%d ", path[i]);printf("%d\n", path[len - 1]);flag = true;}// 如果没有到达终点,继续深搜,遍历该点的所有邻边for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];       // 邻边的终点path.push_back(j);  // 将下一个点加入路径dfs(j);             // 递归深搜path.pop_back();    // 弹出该邻边的终点,继续遍历下一个邻边}
}int main()
{memset(h, -1, sizeof h);scanf("%d%d", &n, &m);while (m -- ){int a, b;scanf("%d%d", &a, &b);add(a, b);}path.push_back(1);      // 先加入起点dfs(1);                 // 从起点开始深搜if (!flag) puts("-1");return 0;
}

邻接矩阵方法

#include <iostream>
#include <cstring>
#include <vector>using namespace std;const int N = 110;int n, m;
int g[N][N];
bool flag;
vector<int> path;void dfs(int u)
{// 如果到达了终点,输出完整路径if (u == n){int len = path.size();  // 路径的长度for (int i = 0; i < len - 1; i++) printf("%d ", path[i]);printf("%d\n", path[len - 1]);flag = true;}// 如果没有到达终点,继续深搜,遍历该点的所有邻边for (int i = 1; i <= n; i++){if (g[u][i] == 1){path.push_back(i);  // 将下一个点加入路径dfs(i);             // 递归深搜path.pop_back();    // 弹出该邻边的终点,继续遍历下一个邻边}}
}int main()
{scanf("%d%d", &n, &m);while (m -- ){int a, b;scanf("%d%d", &a, &b);g[a][b] = 1;                // 值为1代表右边,0代表无边}path.push_back(1);      // 先加入起点dfs(1);                 // 从起点开始深搜if (!flag) puts("-1");return 0;
}

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

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

相关文章

【BeX5】知识中心

Grid组件修改行选中颜色 .x-state-highlight, .x-grid-widget-content .x-state-highlight, .x-grid-widget-header .x-state-highlight {background: yellow; }

计算机网络-子网掩码的计算

计算机网络中的子网掩码计算及相关知识 在计算机网络中&#xff0c;子网掩码是一个非常重要的概念。它不仅帮助我们区分网络地址和主机地址&#xff0c;还在网络划分、管理和安全中发挥着重要作用。本文将介绍子网掩码的基本概念、计算方法及其在网络中的应用。 子网掩码的基…

2406,D2024年二月会议

原文 参会者 以下人员(略)出席了会议. 前面 我告诉大家,社区对话系列复兴的第一个视频相当顺利.马丁做得很好.因为拉兹万和我已讨论过他的参与,我问他是否愿意做下个.他接受了.另一个 第1项目:数组文本的d运行时勾挂实现 Razvan总结了TeodorDutu在他的,即用模板替换d运行时…

MathWorks的介绍,以及Simscape 的主要特点

MathWorks 是一家美国的软件公司&#xff0c;以其科学计算软件为广泛知名&#xff0c;特别是 MATLAB 和 Simulink。这两款产品广泛用于工程、科学研究、学术界和工业应用中&#xff0c;帮助用户进行数学计算、算法开发、数据可视化、数据分析&#xff0c;以及仿真和模型构建。 …

每日5题Day23 - LeetCode 111 - 115

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeN…

探索Java 8 Stream API:现代数据处理的新纪元

Stream流 Stream初探&#xff1a;何方神圣&#xff1f; Stream流是一种处理集合数据的高效工具&#xff0c;它可以让你以声明性的方式处理数据集合。Stream不是存储数据的数据结构&#xff0c;而是对数据源&#xff08;如集合、数组&#xff09;的运算操作概念&#xff0c;支…

python绘制散点图

文章目录 1.实验目的2.需求3. 代码以及资源文件4.实验结果 1.实验目的 掌握Python绘图库matplotlib库 2.需求 3. 代码以及资源文件 import numpy as np import matplotlib.pyplot as plt import pandas as pd# 读取NPZ文件 data np.load(../Files/国民经济核算季度数据.npz…

cilium关闭vxlan

说明 操作 启用标志 yum -y install net-tools.x86_64 ifconfig | grep vxlan cilium_vxlan: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500修改相关配置 ks get cm cilium-config -oyaml | grep -E tunnel|ipv4-native-routing-cidr|auto-direct-node-routes…

[AIGC] Java List接口详解

List接口是Java集合框架的一部分&#xff0c;它是一个有序的集合&#xff0c;允许包含重复的元素。List接口在java.util包中&#xff0c;它扩展了Collection接口。本篇文章将详细介绍Java中List接口的常用API。 List接口的常用方法 以下列出了一些List接口的常用方法&#xf…

【OceanBase DBA早下班系列】—— 性能问题如何 “拍CT“ (一键获取火焰图和扁鹊图)

1. 前言 最近接连遇到几个客户的环境在排查集群性能问题&#xff0c;总结了一下&#xff0c;直接教大家如何去获取火焰图、扁鹊图&#xff08;调用关系图&#xff09;&#xff0c;直击要害&#xff0c;就像是内脏的疾病去医院看病&#xff0c;上来先照一个CT&#xff0c;通过分…

for循环结构

循环&#xff1a; 循环是一个重复执行一个代码的结构。只要满足循环的条件&#xff0c;会一直执行这个代码。 循环条件&#xff1a;在一定范围之内&#xff0c;按照指定的次数来执行循环。 循环体&#xff1a;在指定的次数内&#xff0c;执行的命令序列。只要条件满足&#…

【iOS】KVC相关总结

目录 1. 什么是KVC&#xff1f;2. 访问对象属性常用方法声明基础使用KeyPath路径多值操作 3. 访问集合属性4. 集合运算符自定义集合运算符 5. 非对象值处理访问基本数据类型访问结构体 6. 属性验证7. 设值和取值原理基本的Getter搜索模式基本的Setter搜索模式NSMutableArray搜索…

vue3+ele-plus+sortableJs对el-table使用sortableJs插件对表格拖拽时限定某列或某行不允许拖拽

如需有对el-table表格进行拖拽的需求&#xff0c;请点击&#xff1a; eleplus对el-table表格进行拖拽(使用sortablejs进行列拖拽和行拖拽)&#xff1a;-CSDN博客 如果你已实现拖拽需求&#xff0c;但拖拽后发现表头并未改变的话&#xff0c;请点击&#xff1a; 解决el-table表…

Windows本地使用SSH连接VM虚拟机

WIN10 VM17.5 Ubuntu:20.04 1.网路设置 1)选择编辑->更改设置 配置完成 2.修改了服务器文件&#xff0c;修改sshd配置&#xff0c;在此文件下/etc/ssh/sshd_config&#xff0c;以下为比较重要的配置 PasswordAuthentication yes PermitRootLogin yes PubkeyAuthenticat…

如何优雅地中断一个网络请求

在前端开发中&#xff0c;网络请求无处不在。但有时候&#xff0c;由于各种原因&#xff08;如用户取消操作、页面跳转等&#xff09;&#xff0c;我们需要中断正在进行的网络请求&#xff08;本文只针对前端实现&#xff09;。那么&#xff0c;如何优雅地实现这一功能呢&#…

C++学习笔记“类和对象”:多态;

目录 4.7 多态 4.7.1 多态的基本概念 4.7.2 多态案例--计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二 - 制作饮品 4.7.5 虚析构和纯虚析构 4.7.6 多态案例三-电脑组装 4.7 多态 4.7.1 多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静志多态: 函数…

apex触发器满足条件时弹出对话框

在Salesforce中&#xff0c;Apex触发器是在记录的数据库操作&#xff08;如插入、更新、删除&#xff09;之前或之后执行的逻辑。由于Apex触发器运行在服务器端&#xff0c;无法直接触发客户端&#xff08;浏览器&#xff09;上的对话框。不过可以通过以下方法间接实现这一需求…

[ue5]建模场景学习笔记(6)——必修内容可交互的地形,交互沙(4)

1.需求分析&#xff1a; 现在我们已经有了可以在世界内近于无限的跑动痕迹&#xff0c;现在需要对痕迹进行细化&#xff0c;包括例如当人物跳起时便不再绘制痕迹&#xff0c;以及痕迹应该存在深浅&#xff0c;应该由两只脚分别绘制&#xff0c;同时也应该对地面材质进行进一步处…

程序性能分析:工具与策略

在软件开发中&#xff0c;程序性能分析是一个至关重要的环节。无论是为了确保代码的正确性&#xff0c;还是为了提高程序的运行效率&#xff0c;性能分析都是不可或缺的。本文将介绍程序性能分析的策略以及一系列性能分析和内存检查工具。 一、性能分析的策略 先保证正确性&a…

Vue基本使用-02

上节我们讲了什么是mvvm模型&#xff0c;以及我们vue的一些常用指令&#xff0c;今天给大家讲一下vue的基本使用&#xff0c;在将之前我们需要重点讲解我们的一个指令&#xff0c;v-model指令 v-model v-model 可以在组件上使用以实现双向绑定,什么是双向绑定呢?意思就是当我们…