图论---图的遍历

在图论中,图的遍历一般有两种,分别为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; // 只要加入队列立刻标记,避免重复访问
            }
        }
    }
}
相关推荐
爱学习的小仙女!几秒前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
AndrewHZ3 分钟前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard11 分钟前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
fab 在逃TDPIE1 小时前
Sentaurus TCAD 仿真教程(十)
算法
天赐学c语言1 小时前
12.19 - 买卖股票的最佳时机 && const的作用
c++·算法·leecode
菜鸟233号1 小时前
力扣78 子集 java实现
java·数据结构·算法·leetcode
yesyesyoucan2 小时前
在线魔方解谜站:从零入门到精通的智能魔方学习平台
学习·算法
Han.miracle2 小时前
数据结构与算法--008四数之和 与经典子数组 / 子串问题解析
数据结构·算法
!停2 小时前
字符函数和字符串函数
算法
AI科技星2 小时前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模