代码随想录算法训练营Day-49 图论01 | 图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础

图论理论基础

**种类:**有向图、无向图、加权有向图

**度:**连到一个节点的线的数量,出度、入度

**连通性:**连通图(任意节点可到达另一节点),强连通图(有向图基础上连通),连通分量(无向图中的极大连通子图)、强连通分量(有向图中的极大强连通子图)

**图的构造方式:**朴素构造(数组)、邻接矩阵(二维矩阵)、邻接表(数组+链表)

**图的遍历方式:**深度优先搜索、广度优先搜索


深搜理论基础

从起点到终点有多少条路径,或者求最短路径。思路为一直搜索到头再回溯找别的路

深搜三部曲

1.确定函数返回类型和参数变量,基本都是

cpp 复制代码
void dfs(图, 当前节点)

**2.终止条件:**到达终点或者找到了遍历过的节点

3.处理节点:

对于每一个节点,先处理,再递归调用,再回溯


98. 所有可达路径

本题用到了深搜三部曲,构造图,打印路径。

注意事项

  1. 本题n表示节点数、m表示边数看,不要搞混;

  2. 图如果用邻接矩阵来实现,那么就是用**节点数+1作为边长(因为节点从1开始,顺序增加,如果从0开始,就不需要+1了)**的一个正方形。

3. 构造图时,用while(m--),也就是有多少条边就有多少个位置(节点a到节点b)要赋1;

  1. 回溯时,遍历节点,需要遍历所有节点,看当前节点和哪个节点有连接,所以起始是1,遍历到终点节点

深搜三部曲

处理节点的逻辑是:

遍历所有节点,看当前节点和哪个节点有边,如果有边,就把有边的那个节点加入路径

然后把该节点作为当前节点,继续搜索边,所以递归调用dfs(grath, i, end);

然后回溯 ,也就是去遍历其他和当前节点有边的节点,目的是找不同的路径

cpp 复制代码
#include<iostream>
using namespace std;
#include<vector>
vector<vector<int>> result;
vector<int> path;

void dfs(vector<vector<int>>& grath, int cur, int end){
    if(cur == end){
        result.push_back(path);
        return;
    }

    for(int i=1; i<=end; i++){
        if(grath[cur][i] == 1){
            path.push_back(i);
            dfs(grath, i, end);
            path.pop_back();
        }
    }
}

int main(){
    int m,n,s,t;
    cin>>n>>m;
    vector<vector<int>> grath(n+1,vector<int>(n+1,0));
    while(m--){
        cin>>s>>t;
        grath[s][t] = 1;
    }
    path.push_back(1);
    dfs(grath, 1, n);
    if(result.size()==0) cout<<-1<<endl;
    for(const auto& pa:result){
        for(int i = 0;i<pa.size()-1;i++) cout<<pa[i]<<" ";
        cout<<pa[pa.size()-1]<<endl;
    }
    
}

广搜理论基础


相关推荐
小雨下雨的雨43 分钟前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.3 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*4 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
如竟没有火炬5 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi86 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术6 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
Qt程序员7 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
想吃火锅10057 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode
qeen877 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习