算法訓練營DAY50 第十一章:圖論part01

98. 所有可達路徑

98. 所有可達路徑

【題目描述】

給定一個有 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  

?思路

深度優先搜索

深搜三部曲

1、確認遞歸函數,參數

首先dfs函數是對一個圖進行搜索,所以一定要存一個圖;還需要存當前處理的節點x;還需要存一個n表示終點。

還需要一些全局變量

一個res二維數組用來存所有的路徑也就是答案;一個path一維數組用來存單一路徑

(其實在遞歸函數的參數 不容易一開始就確定了,一般是在寫函數體的時候發現缺什么,參加就補什么)

2、確定終止條件

當目前遍歷的節點x 為 最后一個節點 n 的時候 就找到了一條 從出發點到終止點的路徑。

3、處理當前節點出發的路徑

首先要找到x節點指向了哪些節點

for (int i = 1; i <= n; i++) { // 遍歷節點x鏈接的所有節點if (graph[x][i] == 1) { // 找到 x指向的節點,就是節點i}
}

接下來將 選中的x所指向的節點,加入到路徑 path中

然后進入下一層遞歸

最后要注意回溯,撤銷添加節點的操作

輸出格式也需要注意

鄰接矩陣寫法

#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> result; // 收集符合條件的路徑
vector<int> path; // 1節點到終點的路徑void dfs (const vector<vector<int>>& graph, int x, int n) {// 當前遍歷的節點x 到達節點n if (x == n) { // 找到符合條件的一條路徑result.push_back(path);return;}for (int i = 1; i <= n; i++) { // 遍歷節點x鏈接的所有節點if (graph[x][i] == 1) { // 找到 x鏈接的節點path.push_back(i); // 遍歷到的節點加入到路徑中來dfs(graph, i, n); // 進入下一層遞歸path.pop_back(); // 回溯,撤銷本節點}}
}int main() {int n, m, s, t;cin >> n >> m;// 節點編號從1到n,所以申請 n+1 這么大的數組vector<vector<int>> graph(n + 1, vector<int>(n + 1, 0));while (m--) {cin >> s >> t;// 使用鄰接矩陣 表示無線圖,1 表示 s 與 t 是相連的graph[s][t] = 1;}path.push_back(1); // 無論什么路徑已經是從0節點出發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;}
}

鄰接表寫法

#include <iostream>
#include <vector>
#include <list>
using namespace std;vector<vector<int>> result; // 收集符合條件的路徑
vector<int> path; // 1節點到終點的路徑void dfs (const vector<list<int>>& graph, int x, int n) {if (x == n) { // 找到符合條件的一條路徑result.push_back(path);return;}for (int i : graph[x]) { // 找到 x指向的節點path.push_back(i); // 遍歷到的節點加入到路徑中來dfs(graph, i, n); // 進入下一層遞歸path.pop_back(); // 回溯,撤銷本節點}
}int main() {int n, m, s, t;cin >> n >> m;// 節點編號從1到n,所以申請 n+1 這么大的數組vector<list<int>> graph(n + 1); // 鄰接表while (m--) {cin >> s >> t;// 使用鄰接表 ,表示 s -> t 是相連的graph[s].push_back(t);}path.push_back(1); // 無論什么路徑已經是從0節點出發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;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917660.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917660.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV:從入門到實戰的全方位指南

目錄 一、OpenCV 簡介 &#xff08;一&#xff09;特點 &#xff08;二&#xff09;應用場景 二、OpenCV 的核心模塊 &#xff08;一&#xff09;core 模塊 &#xff08;二&#xff09;imgproc 模塊 &#xff08;三&#xff09;video 模塊 &#xff08;四&#xff09;f…

如何在 Ubuntu 24.04 上安裝和配置 TFTP 服務器

了解如何在 Ubuntu 24.04 Linux 上安裝 TFTP 以執行基本的文件傳輸。 簡單文件傳輸協議(TFTP)是標準 FTP 的輕量級替代方案,用于在聯網設備之間傳輸文件。與 FTP 和 HTTP 相比,TFTP 更簡單,無需復雜的客戶端-服務器模型即可操作。這就是為什么該協議用于執行基本文件傳輸…

基于 AXI-Lite 實現可擴展的硬件函數 RPC 框架(附完整源碼)

AXI-Lite 實現RPC調用硬件函數服務 &#x1f44b; 本文介紹如何基于 AXI-Lite 總線設計一個通用的“硬件函數調用框架”。主機端&#xff08;PS&#xff09;只需通過寄存器寫入參數與啟動標志&#xff0c;即可觸發 PL 模塊執行指定算法邏輯&#xff0c;并將結果返回。 該機制本…

[spring-cloud: NamedContextFactory ClientFactoryObjectProvider]-源碼閱讀

依賴 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-commons</artifactId><version>4.3.0</version> </dependency>源碼 NamedContextFactory NamedContextFactory 類通過創建多個子…

HBase MOB技術特點及使用場景介紹

在 HBase 2.0 版本之前,雖然 HBase 能夠存儲從 1 字節到 10MB 大小的二進制對象 ,但其讀寫路徑主要針對小于 100KB 的值進行了優化。當面對大量大小在 100KB - 10MB 之間的數據時,傳統的存儲方式就會暴露出問題。例如,當存儲大量的圖片、文檔或短視頻等中等大小對象時,由于…

Ubuntu 配置密鑰+密碼登錄

目錄 1、密鑰生成 2、發送公鑰至 需要連接的服務器 3、選用私鑰登錄 1、密鑰生成 ssh-keygen -t rsa -b 4096 -C "angindem"2、發送公鑰至 需要連接的服務器 將.ssh中的id_rsa.pub 的密鑰&#xff0c;放在authorized_keys中 注意&#xff1a;.ssh 文件夾一定賦予…

谷歌瀏覽器Chrome 緩存遷移

步驟 1&#xff1a;準備數據遷移1. 關閉 Chrome 及所有后臺進程在任務管理器&#xff08;CtrlShiftEsc&#xff09;中結束所有 chrome.exe 進程。 2. 備份并移動原數據- 將 C:\Users\xxx\AppData\Local\Google\Chrome\User Data **整個文件夾**復制到新位置&#xff08;如 G:\…

Java中的RabbitMQ完全指南

Java中的RabbitMQ完全指南 1. 引言 什么是RabbitMQ RabbitMQ是一個開源的消息代理和隊列服務器&#xff0c;實現了高級消息隊列協議&#xff08;AMQP&#xff09;。它充當應用程序之間的消息中間件&#xff0c;允許分布式系統中的不同組件進行異步通信。RabbitMQ使用Erlang語言…

【MCAL】AUTOSAR架構下SPI數據異步DMA收發具體實現

目錄 前言 正文 1.依賴的硬件特性 1.1.SPI硬件特性 1.1.1. TXFIFO Single Move Mode 1.1.2. RXFIFO Single Move Mode 1.1.3. Move Counter模式 1.1.4. PT中斷 1.2.IR硬件特性 1.3.DMA硬件特性 1.3.1. DMA通道硬件請求 1.3.2. DMA循環Buffer 1.3.3. DMA Link List …

【Unity】協程 Async

協程 協程是 Unity 內置的異步機制&#xff0c;通過 yield 暫停執行&#xff0c;實現任務在多幀中分段執行。與普通函數不同&#xff0c;協程可在執行過程中掛起和恢復&#xff0c;呈現"并發"效果&#xff0c;但本質上仍運行于主線程。若在協程中進行耗時操作&#…

《揭秘!10 分鐘洞悉 Prompt、Function Calling、MCP 與 AI agent 奧秘》

Prompt、Function Calling、MCP、AI agent這些術語頻繁闖入我們的視野&#xff0c;它們到底都是什么、有啥關系。只需十分鐘&#xff0c;咱們抽絲剝繭&#xff0c;揭開它們的神秘面紗&#xff0c;輕松掌握這些關鍵概念 并了解AI agent 完整執行流程。 一、提示詞&#xff08;P…

決策樹(回歸樹)全解析:原理、實踐與應用

文章目錄一、概述1.1 介紹1.2 回歸樹和分類樹區別二、重要參數、屬性及接口2.1 criterion&#xff08;不純度衡量指標&#xff09;2.2 回歸樹如何工作&#xff08;核心流程拆解&#xff09;三、用回歸樹擬合正弦曲線&#xff08;實戰案例&#xff09;3.1 繪制正弦曲線3.2 為正弦…

【盤古100Pro+開發板實驗例程】FPGA學習 | HDMI 回環實驗

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1. 實驗簡介 實驗目的&#xff1a; 完成 HDMI 回環實驗 實驗環境&#xff1a; Window11 PDS2022.2-SP6.4 硬件環境…

鴻蒙系統PC安裝指南

鴻蒙系統PC安裝指南一、安裝DevEco Studio集成開發環境二、下載鴻蒙系統PC三、啟動鴻蒙系統及使用一、安裝DevEco Studio集成開發環境首先訪問華為官網上&#xff0c;注冊并登錄華為賬號&#xff0c;以開始下載所需的軟件。若尚未注冊&#xff0c;請先注冊一個。在官網頁面中&a…

三十九、【擴展工具篇】Allpairspy 組合用例生成器:智能設計高效測試集

三十九、【擴展工具篇】Allpairspy 組合用例生成器:智能設計高效測試集 前言 準備工作 第一部分:后端實現 - `allpairspy` API 1. 創建 `allpairspy` 服務 2. 創建 `allpairspy` API 視圖 3. 注冊 API 路由 第二部分:前端實現 - `Allpairspy` 工具界面 1. 創建 API 服務 (`s…

ZooKeeper 深度實踐:從原理到 Spring Boot 全棧落地

在 Kubernetes 為主流注冊發現的今天&#xff0c;給出如何在 Spring Boot 中基于 ZooKeeper 實現服務注冊/發現、分布式鎖、配置中心以及集群協調的完整代碼與最佳實踐。所有示例均可直接復制運行。 1. ZooKeeper 架構與核心原理 1.1 角色 Leader&#xff1a;處理寫請求&…

可驗證隨機函數-VRF

可驗證隨機函數&#xff08;Verifiable Random Function, VRF&#xff09;是一種結合密碼學技術的偽隨機數生成器&#xff0c;其核心特點是生成的隨機數可被公開驗證&#xff0c;且具有不可預測性和唯一性。以下是VRF的詳細解析&#xff1a;1. 基本定義與核心特性 可驗證性&…

極客大挑戰2020(部分wp)

Roamphp1-Welcome 405請求方法不允許&#xff0c;改一下請求方法 數組繞過&#xff0c;在頁面搜索flag即可&#xff01;本題&#xff1a;就是知道了405是請求方法不允許&#xff01; Roamphp2-Myblog&#xff08;zip協議加文件包含&#xff09; 首先進來就是一個博客頁面&…

ESP32 外設驅動開發指南 (ESP-IDF框架)——GPIO篇:基礎配置、外部中斷與PWM(LEDC模塊)應用

目錄 一、前言 二、GPIO 2.1 GPIO簡介 2.2 GPIO函數解析 2.3 LED驅動 2.4 KEY驅動 三、EXIT 3.1 EXIT簡介 3.2 EXIT函數解析 3.3 EXIT驅動 四、LEDC 4.1 PWM原理解析 4.2 ESP32的LED PWM控制器介紹 4.3 LEDC函數解析 4.3.1 SW_PWM 4.3.2 HW_PWM 4.4 LEDC驅動 …

鴻蒙 ArkWeb 加載優化方案詳解(2025 最佳實踐)

適用平臺&#xff1a;HarmonyOS NEXT / API 10 關鍵詞&#xff1a;ArkWeb、WebviewController、NodeController、預加載、預連接、預渲染、性能優化一、前言&#xff1a;為什么必須優化 ArkWeb 加載&#xff1f;在鴻蒙生態中&#xff0c;ArkWeb 是系統級的 Web 容器引擎&#x…