代码随想录算法训练营第五十六天 | 98.所有可达路径

news/2024/10/6 3:09:49/文章来源:https://www.cnblogs.com/cscpp/p/18287216

98.所有可达路径

题目链接 文章讲解


邻接矩阵法

邻接矩阵使用二维数组来表示图结构。邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组

为了节点标号和下标对其,有n个节点的图申请(n + 1) * (n + 1)的空间

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

输入m条边构造图

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

完整代码:

#include <iostream>
#include <vector>using namespace std;void dfs(const vector<vector<int>>& graph, int x, int n);vector<vector<int>> result; // 结果集
vector<int> path; // 当前路径int main() {int N; // 图中有N个节点int M; // 图中有M条边int s, t; // 两个相邻的节点while(cin >> N >> M) {vector<vector<int>> graph(N + 1, vector<int>(N + 1, 0)); // 邻接矩阵存放图while(M--) {cin >> s >> t;graph[s][t] = 1; // 1表示有一条边连接s->t  }// 第一个节点加入路径path.push_back(1);dfs(graph, 1, N);if(result.size() == 0) cout << -1 << endl;// 输出结果for(auto path : result) {for(int i = 0; i < path.size() - 1; ++i) {cout << path[i] << " ";}cout << path[path.size() - 1] << endl;}}return 0;
}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]) {  // 当前节点到i节点由路径,将i加入路径path.push_back(i);dfs(graph, i, n); // 进入下一层递归path.pop_back(); // 回溯}}return ;
}

邻接表写法

邻接表使用数组加链表的方式来表示。邻接表是从边的数量来表示图,有多少条边就申请多大的空间

构造邻接表

vector<list<int>> graph(n + 1); // 邻接表,list为链表

输入m条边构造图

while (m--) {cin >> s >> t;// 使用邻接表 ,表示 s -> t 是相连的graph[s].push_back(t);
}

完整代码:

#include <iostream>
#include <vector>
#include <list>using namespace std;void dfs(const vector<list<int>>& graph, int x, int n);vector<vector<int>> result; // 结果集
vector<int> path; // 当前路径int main() {int N; // 图中有N个节点int M; // 图中有M条边int s, t; // 两个相邻的节点while(cin >> N >> M) {vector<list<int>> graph(N + 1); // 邻接矩阵存放图while(M--) {cin >> s >> t;graph[s].push_back(t); // 表示s到t有一条边连接s->t  }path.push_back(1);dfs(graph, 1, N);if(result.size() == 0) cout << -1 << endl;for(auto path : result) {for(int i = 0; i < path.size() - 1; ++i) {cout << path[i] << " ";}cout << path[path.size() - 1] << endl;}}return 0;
}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();}return ;
}

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

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

相关文章

暑假第一周总结

弗洛伊德基本思想弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法是非常优雅的,可读性和理解都非常好。 基本思想:弗洛伊德算法定义了两个二维矩阵: 矩阵D记录顶点间的最小路径例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10;矩阵P记录顶点间最小…

zadig 安装和使用

介绍 Zadig 是由 KodeRover 公司基于 Kubernetes 研发的自助式云原生 DevOps 平台,源码 100% 开放。Zadig 提供灵活可扩展的工作流支持、多种发布策略编排以及一键安全审核等特性。该平台还支持定制的企业级 XOps 敏捷效能看板,深度集成多种企业级平台,并通过项目模板化批量…

将jar可执行文件打包为windows安装包体

当我们希望将java编写的可执行文件.jar打包为一个.exe供用户直接使用,我们需要将jre/jdk也打包到exe中,这样用户环境就不需要安装jdk,直接运行我们做好的exe文件。 整个过程分为两步,为了方便演示,这里使用JMonkeyEngine SDK打包一个jme3游戏的方式来解释。 工具 首先下载…

FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt

​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有比较两种比较新的流媒体协议,分别是SRT和RIST。 其中SRT全称为Secure Reliable Transport,中文叫做安全可靠传输协议。RIST全称…

java学习进度

(1)通过视频学习了解了java基本概述 (2)成功下载了Eclipse,并搭建java环境 (3)使用Eclipse运行"hello world"程序 代码如下: package hello; public class helloworld { public static void main(String[] args) {// TODO Auto-generated method stubSystem.…

横截面交易策略:概念与示例

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 什么是横截面策略 横截面交易策略(Cross-Sectional Trading Strategy)是一种金融市场上的交易策略,它是基于不同资产之间的相对价值或其他因子的差异来进行投资决策。这种策略的核…

Spark快速大数据分析PDF下载读书分享推荐

《Spark 快速大数据分析》是一本为 Spark 初学者准备的书,它没有过多深入实现细节,而是更多关注上层用户的具体用法。不过,本书绝不仅仅限于 Spark 的用法,它对 Spark 的核心概念和基本原理也有较为全面的介绍,让读者能够知其然且知其所以然。 Spark快速大数据分析PDF下载…

IP核:XDMA学习

知识: XDMA效率没有RIFFA高,最高似乎只支持1288位宽; 输出的用户时钟是250MHZ; IP核配置: 参考: https://docs.amd.com/r/zh-CN/pg195-pcie-dma/ 具体:重要:PCIe:BARs标签页该标签页主要用于配置 BAR,所谓的使能和配置各接口 interface,其实质是配置不同的 BAR,首先介…

【模块三】Python高级

面向对象基础 类和对象 概念 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式。 类是人们抽象出来的一个概念,所有拥有相同属性和功能的事物称为一个类;而拥有相同属性和功能的具体事物则成为这个类的实例对象。 面向对象编程提供了一种从现实世界中抽象…

大气热力学(5)——绝热过程

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 目录5.1 气块的概念5.2 热力学第一定律的几种微分形式5.3 干绝热过程5.4 干绝热递减率(干绝热直…

如何解决服务器开机报警问题

解决服务器开机报警问题,需要按照一系列步骤进行故障排查和修复。 一、初步检查与确认 查看报警信息: 观察服务器的指示灯,特别是电源指示灯、硬盘指示灯等,看是否有异常。 如果服务器有显示屏或终端窗口,查看是否有相应的警告信息或错误代码。 确认电源状态: 检查电源线…

用友财务软件数据库恢复

是一个关键的操作,旨在解决数据库文件损坏或数据丢失的问题。 一、恢复方法使用软件内置的数据恢复工具 步骤: 打开用友财务软件,进入“工具”或“数据管理”等相关菜单。 找到“数据库恢复”或“数据恢复”选项,点击进入。 选择需要恢复的数据库文件和备份文件。这里需要确…