图论:深度优先遍历(DFS)与广度优先遍历(BFS)

今天来死磕DFS和BFS(学DFS和BFS的那节课我都没上,死磕起来比别人难一点)

DFS:

题目描述

请定一个无向图,顶点编号从0∼n−1

用深度优先搜索(DFS) 从 0 开始遍历并输出

遍历时,先遍历节点编号小的

输入格式

输入第一行是两个整数k,m(0<k≤100,0<m≤k×k),表示有m条边,k个顶点。

下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

输出格式

输出有1行,表示DFS的遍历结果。

输入样例

复制代码
4 4
0 1
0 2
0 3
2 3

输出样例

复制代码
0 1 2 3

思路:

图论背模板,数论背公式,高精背代码,动规背方程,套一下DFS模板(注意要求先遍历编号小的,所以还得排序)

AC代码:
cpp 复制代码
#include <bits/stdc++.h>//万能库
using namespace std;//cin,cout必备
vector<int>r[105];//vector数组存储图的信息(一般来说它等于二维数组,但是排序就没法用二维数组)
bool vis[105];//用于标记是否访问过
void DFS(int u)//DFS函数
{
    cout<<u<<" ";//先输出
    for(int i=0;i<r[u].size();i++)//遍历vector
    {
        if(!vis[r[u][i]])//没有访问过
        {
            vis[r[u][i]]=1;//标记为已访问
            DFS(r[u][i]);//调用函数继续递归下去
        }
    }
}
int main()//主函数
{
    int k,m;//k个顶点,m条边
    cin >> k >> m;//读入数据
    while(m--)//用while省时
    {
        int u,v;//连接u,v两点的无向边
        cin >> u >> v;//输入
        r[u].push_back(v);//u能到v
        r[v].push_back(u);//v能到u
    }
    for(int i=0;i<k;i++)//k个顶点
    {
        sort(r[i].begin(),r[i].end());//排序
    }
    vis[0]=1;//第一个节点访问过了
    DFS(0);//开始DFS
    return 0;//"愉快"的结束
}

BFS:

恶心的BFS,他来了!(上次我死磕3天才做出来,主要是没学,一些东西只能乱写)

题目描述

请定一个无向图,顶点编号从0∼n−1,用广度优先搜索(BFS),遍历并输出。遍历时,先遍历节点编号小的。

输入格式

输入第一行是两个整数k,m(0<k≤100,0<m≤k×k),表示有m条边,k个顶点。

下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

输出格式

输出有1行,表示BFS的遍历结果。

输入样例

复制代码
4 4
0 1
0 2
0 3
2 3

输出样例

复制代码
0 1 2 3

思路:

没什么可说的......模板套错,一切都完

AC代码:
cpp 复制代码
#include <bits/stdc++.h>//万能库
using namespace std;//cin,cout必备
vector<int>r[105];//vector数组存储图的信息(一般来说它等于二维数组,但是排序就没法用二维数组)
bool vis[105];//用于标记是否访问过
void BFS(int u)//BFS函数
{
    queue<int>q;//BFS使用队列实现的,所以搞一个STL里面的队列
    vis[u]=true;//标记为已访问
    q.push(u);//加入队列
    while(!q.empty())//队列非空
    {
        int cur=q.front();//队头元素
        q.pop();//出队
        cout<<cur<<" ";//输出一下
        for(int i=0;i<r[u].size();i++)//遍历vector
        {
            if(!vis[r[u][i]])//没有访问过
            {
                vis[r[u][i]]=1;//标记为已访问
                q.push(r[u][i]);//加入队列
            }
        }
    }
}
int main()//主函数
{
    int k,m;//k个顶点,m条边
    cin >> k >> m;//读入数据
    while(m--)//用while省时
    {
        int u,v;//连接u,v两点的无向边
        cin >> u >> v;//输入
        r[u].push_back(v);//u能到v
        r[v].push_back(u);//v能到u
    }
    for(int i=0;i<k;i++)//k个顶点
    {
        sort(r[i].begin(),r[i].end());//排序
    }
    vis[0]=1;//第一个节点访问过了
    BFS(0);//开始BFS
    return 0;//"愉快"的结束
}

怎么样,有没有吐?当时我就是那节课老师敲代码,我在那抄,然后抄的都是对的,一运行就是0 1 1 1,把我气到差点吐血了!后来千方百计地去网上找资料,外加狼狈不堪地问同学(同学:"什么?这题你不会?老师不是讲过了吗?不是,连我们班第一都不会,太离谱了!")经历了九九八十一难之后,终于!还是错的......我很气,就去找那个人,结果....... "你真信了?我贴的就是你的错误代码"(吐血)最后还是网上的某位大佬帮了我......

这篇乱扯博客就到这里啦,我们下篇博客再见!

相关推荐
青少儿编程课堂12 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂19 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂2 天前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂3 天前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂6 天前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园成语接龙大挑战解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂6 天前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂7 天前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
Tairitsu_H7 天前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
数据结构·c++·图论
Tairitsu_H7 天前
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?
数据结构·c++·图论·最小生成树
海绵宝宝转agent8 天前
LeetCode100 二叉树个人题解
算法·leetcode·深度优先