图论---图的遍历

在图论中,图的遍历一般有两种,分别为DFS(深度优先遍历)、BFS(广度优先遍历),以下是这两种遍历方式的模板:

DFS(深度优先搜索)

代码框架:

复制代码
void dfs(参数) {
    if (终止条件) {
        存放结果;
        return;
    }
​
    for (选择:本节点所连接的其他节点) {
        处理节点;
        dfs(图,选择的节点); 
        回溯,撤销处理结果
    }
}
void main_function(参数){
    for(遍历所有节点){
        if(节点未遍历){
            dfs(该节点)
        }
    }
}

BFS(广度优先搜索)

代码框架:

复制代码
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
    int m = grid.size(),n = grid[0].size();
    queue<pair<int, int>> que; // 定义队列
    que.push({x, y}); // 起始节点加入队列
    visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点
    while(!que.empty()) { // 开始遍历队列里的元素
        auto cur = que.front(); // 从队列取元素
        que.pop(); 
        int x = cur.first;
        int y = cur.second; // 当前节点坐标
        for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历
            int tx = x + dir[i][0];
            int ty = y + dir[i][1]; // 获取周边四个方向的坐标
            if (tx >= 0 && tx < m && ty >= 0 && ty < n && !visited[tx][ty]) { // 如果节点没被访问过
                que.push({tx, ty});  // 队列添加该节点为下一轮要遍历的节点
                visited[tx][ty] = true; // 只要加入队列立刻标记,避免重复访问
            }
        }
    }
}
相关推荐
qq7422349846 分钟前
Gradio 极简入门:三分钟为AI模型打造交互界面,并对比Streamlit与Dash如何选型
人工智能·算法·大模型·交互·dash
1000世界小札6 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121979 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
兴通物联科技10 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
月华路12 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
我想走路带风12 小时前
LRU和最长前缀和(计算机网络算法)
计算机网络·算法
M78佐菲13 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
徐小夕14 小时前
表格、文档、甘特、大屏、表单一站打通:pxcharts超级表格4.0正式上线!
前端·算法·github
TechLee15 小时前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法