代码随想录算法训练营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;
    }
    
}

广搜理论基础


相关推荐
zyl76511 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖15 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌15 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F15 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791315 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
AI wins15 小时前
c++新增頭文件
c++
Shadow(⊙o⊙)16 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++
tomwang032216 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!16 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
by2099916 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表