首页 > 编程语言 >代码随想录算法训练营第五十六天 | 98.所有可达路径

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

时间:2024-07-06 14:32:09浏览次数:20  
标签:int graph 随想录 back 98 vector path 第五十六 节点

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 ;
}

标签:int,graph,随想录,back,98,vector,path,第五十六,节点
From: https://www.cnblogs.com/cscpp/p/18287216

相关文章

  • 代码随想录算法训练营第二天 | 203.移除链表元素 707.设计链表 206.反转链表
    代码随想录算法训练营第二天|203.移除链表元素707.设计链表206.反转链表进入链表章节,就要和虚拟头结点(dummyhead)打交道了,还要注意边界条件和空指针异常移除链表元素题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A......
  • 「代码随想录算法训练营」第四天 | 链表 part2
    24.两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/题目难度:中等文章讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#算法公开课视频讲解:https://www.bilibili.com/video/BV1YT411g7br题目状态:有思路,但细节缺乏考虑个......
  • 代码随想录算法训练营第3天 | 链表删除元素
    删除链表元素,技巧是设置一个虚拟头节点,这样就可以把原始头节点当做普通节点处理了,最后再返回虚拟头结点的next即可。题203.移除链表元素/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*......
  • 代码随想录day15 平衡二叉树 | 二叉树的所有路径 | 左叶子之和 | 完全二叉树的节点个
    平衡二叉树平衡二叉树解题思路二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。这道题由于需要求节点的高度差来进行判断,因此我们需要用后序遍历,先左右,后中间。推荐使用递归把每个节点的高度算出来......
  • 代码随想录算法训练营第五十五天 | 42.接雨水 84.柱状图中最大的矩形
    42.接雨水题目链接文章讲解视频讲解思路找到当前柱子左边第一个比它高的和右边第一个比它高的柱子进行计算,右边第一个比它搞得柱子可以循环遍历得到,左边第一个比它高的柱子就是栈中下一个元素classSolution{public:inttrap(vector<int>&height){stack......
  • [每日一题] - CF1982E
    校内作业多,一直忘记写blog现在开始补上量赛后几天秒掉了,场上真是困糊涂了,没想到分治#include<bits/stdc++.h>usingnamespacestd;constintmod=1e9+7;#definelllonglong#definenodepair<int,pair<ll,ll>>#definemp(x,y,z)make_pair(x,make_pair(y,z))#definefi......
  • 代码随想录算法训练营第五十三天 | 739.每日温度 496.下一个更大的元素I 503.下一个更
    739.每日温度题目链接文章讲解视频讲解单调栈适合的场景:求当前元素左面或右面第一个比它大或小的元素单调栈里存什么元素只要存下标就可以了,比较元素时可以通过下标取元素单调栈是单调增还是单调减(从栈顶到栈底)使用单调增的单调栈解题步骤:遍历数组,当栈空时直接入栈......
  • 代码随想录刷题day 3 | 链表理论基础 203.移除链表元素 707.设计链表 206.反转链
    203.移除链表元素classSolution{publicListNoderemoveElements(ListNodehead,intval){ListNodevirHead=newListNode(0,head);ListNodetmp=virHead;while(tmp.next!=null){if(tmp.next.val==val){......
  • MAX98357、MAX98357A、MAX98357B小巧、低成本、PCM D类IIS放大器,具有AB类性能中文说明
    前言:MAX98357A支持标准I2S数据,MAX98357B支持左对齐数字音频数据。两个版本均支持8通道TDM音频数据。IIS数字功放MAX98357开发板/评估系统MAX98357WLP-9(1.347x1.437mm)封装的外观和丝印AKMMAX98357TQFN-16-EP(3x3mm)封装的外观和丝印AKK引脚说明WLP......
  • IIS数字功放MAX98357开发板/评估系统
    前言MAX98357中文介绍请访问下行链接MAX98357、MAX98357A、MAX98357B小巧、低成本、PCMD类IIS放大器,具有AB类性能中文说明规格书一般描述MAX98357开发板(DEV板)是一个完全组装并经过测试的PCB,用于评估MAX98357I2S数字输入D类功率放大器。DEV板采用2.5V至5.5V单直......