BFS和DFS代码实现

2023-11-04

BFS DFS实现图的遍历
以以下图数据为例:
在这里插入图片描述
首先BFS是广度优先遍历算法,从图的某一个节点出发,然后遍历完这个节点相邻的节点。这个算法的核心就是,先把周围的找完,再去找更深的地方。通俗易懂的说法:DFS就是一条路走到底,发现没路了,返回来,走另一条路。BFS就是每条路都走一点,走一点点后就走另一条路了。
在BFS遍历的时候,需要用队列将遍历的这个节点的相邻节点添加到队列中去,然后取队首,将这个节点相邻的节点加到队列中(未在队列中的),重复上述步骤。
以上面的图为例,假定我们先将A节点加入队列中,然后A节点出队列,与A节点相邻的B、C节点依次入队列,然后B节点出队列,与B节点相邻的C、D节点依次入队列…
最终我们得到的出队列的顺序为:A B C D E F,此答案不唯一,比如在A出队列后,可以先将B加入队列,然后是C,那么结果可能是A C B D E F,注意:绝对不可能是A B C E D F,因为B和E不相邻。
根据以上思路,我们用Python代码实现BFS如下:

def DFS(graph, s):
    queue = []
    queue.append(s)             # 向list添加元素,用append()
    seen = set()                  # 此处为set, python里set用的是hash table, 搜索时比数组要快。
    seen.add(s)                 # 向set添加函数,用add()
    while (len(queue) > 0):
        vertex = queue.pop(0)    # 弹出最后一个元素
        nodes = graph[vertex]
        for w in nodes:
            if w not in seen:
                queue.append(w)
                seen.add(w)
        print(vertex)
graph = {
    "A":["B","C"],
    "B":["A","C","D"],
    "C":["A","B","D","E"],
    "D":["B","C","E","F"],
    "E":["C","D"],
    "F":["D"]
}
DFS(graph, 'A')

C++代码如下:

#include <bits/stdc++.h>
using namespace std;
queue<char> q;
bool a[200];
void BFS(vector<char> vi[],char root)
{
	q.push(root);
	while(!q.empty())
	{
		char c = q.front();
		q.pop();
		cout << c << " ";
		a[(int)c] = 1;
		for(int i=0; i<vi[c].size(); i++)
		{
			if(a[(int)vi[c][i]]==0)
			{
				q.push(vi[c][i]);
				a[(int)vi[c][i]] = 1;
			}
		}
	}
}
int main(void)
{
	vector<char> vi[100];
	vi['A'].push_back('B');
	vi['A'].push_back('C');
	vi['B'].push_back('A');
	vi['B'].push_back('C');
	vi['B'].push_back('D');
	vi['C'].push_back('A');
	vi['C'].push_back('B');
	vi['C'].push_back('D');
	vi['C'].push_back('E');
	vi['D'].push_back('B');
	vi['D'].push_back('C');
	vi['D'].push_back('E');
	vi['D'].push_back('F');
	vi['E'].push_back('C');
	vi['E'].push_back('D');
	vi['F'].push_back('D');
	BFS(vi, 'E');
} 

DFS和BFS的唯一不同就是把队列换成栈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BFS和DFS代码实现 的相关文章

  • Java中的DatagramPacket与DatagramSocket的初步

    1 基本概念 a DatagramPacket与DatagramSocket位于java net包中 b DatagramPacket表示存放数据的数据报 DatagramSocket表示接受或发送数据报的套接字 c 由这两个类所有构成的网
  • 安装GPU版本的pytorch

    前言 最近新建了一个虚拟环境 但是在跑代码的时候出现问题 libc10 cuda so cannot open shared object file No such file or directory 去网上搜了一下 说是安装的pytorc
  • 浅析消费金融风控之贷中、贷前、贷后风控(风控模型、决策引擎)

    消费金融迎来 爆发增长 期 预计到2020年 我国消费信贷总市场规模将达到45万亿元 年复合增长率将达到18 前景广阔的消费金融市场 将成为我国经济发展的重要内驱力 业务痛点 征信体系缺失 分支风控标准不一 欺诈手段层出不穷 多头借贷现象普
  • 谈谈「数据仓库构建与分层」

    1 先导知识之 数据库与ER建模 1 1 数据库 DataBase 数据库是按照数据结构来组织 存储和管理数据的仓库 是一个长期存储在计算机内的 有组织的 可共享的 统一管理的大量数据的集合 数据库是以一定方式储存在一起 能与多个用户共享
  • CentOS7搭建Redis Cluster

    目录 什么是Redis Cluster Redis集群介绍 Redis 集群的数据分片 Redis 集群的主从复制模型 Redis 一致性保证 搭建Redis Cluster 三主三从 准备工作 启动所有节点服务 建立集群关系 验证 集群状
  • 找回误删除的文件

    author skate time 2009 11 19 今天在网上帮个美女恢复数据 他昨天不小心 把重要文件删除 而今天又急用 于是我就帮个小忙用两款数据维护软件DiskGenius EasyRecovery帮其恢复 这两个软件结合使用
  • python自定义标识符_python自定义异常

    python自定义异常 try 异常在try块里抛 如果会产生多个异常 捕捉第一个 匹配except 后边的不再捕捉 except 抓异常 else try无异常 才会执行else finally 无论try块是否抛异常 永远执行的代码 通
  • ZYNQ产品生产拷机问题思考

    目前设计的ZYNQ产品支持QSPIFLASH SDka EMMC启动 主要启动方式主要有以下几种 全部启动文件存放在QSPIFLASH ZYNQ支持的QSPIFLASH为16MB大小 如果UBOOT 内核 设备树 文件系统全部存放在QSPI
  • 爬虫破解js加密破解(二) 有道词典js加密参数 sign破解

    在爬虫过程中 经常给服务器造成压力 比如耗尽CPU 内存 带宽等 为了减少不必要的访问 比如爬虫 网页开发者就发明了反爬虫技术 常见的反爬虫技术有封ip user agent 字体库 js加密 验证码 字符验证码 滑动验证码 点触式验证码等
  • Qt中如何让Widget窗体等子控件随边框自适应缩放

    实现的原则很简单 一切子控件都要在布局中添加 如果是widget作控件 widget内部也要有布局 本文将通过Qt Designer和代码化UI设计两种途径讲解实现方法 一 以Qt Designer为例 想要在这个Widget窗体内部再添加
  • Nginx反向代理与conf原理

    Nginx主要功能 Webservice 反向代理 负载均衡 逻辑上 nginx和server的关系是这样的 Nginx和路由器 交换机有什么区别 路由器是物理网关 nginx是应用层网关 物理上 他们的关系是下图这样的 Nginx hap
  • 第21章_瑞萨MCU零基础入门系列教程之事件链接控制器ELC

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do
  • C语言详解系列——循环语句详解(1)while语句的语法结构

    文章目录 while语句 break continue while语句 之前的学习中我们了解到了if语句的用法 这个语句只会执行一次 但在我们的生活当中有许多事情是需要重复去做的 那我们应该怎么实现呢 C语言当中给我们引入了 while语句
  • Day 9

    1 在主函数定义一维数组并赋值 要求 定义函数实现冒泡排序 有参无返函数 定义函数实现输出 有参无返函数 include
  • CPU负载怎么理解?是不是CPU利用率?

    http www hackbase com tech 2011 08 16 64970 html 昨天查看Nagios警报信息 发现其中一台服务器CPU负载过重 机器为CentOS系统 信息如下 2011 2 15 星期二 17 50WAR
  • 这应该是最全的,Fiddler手机App抓包详解,看完还不会来找我...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • [转自华尔街的强帖]怎样才能嫁给有钱人

    一个年轻漂亮的美国女孩在美国一家大型网上论坛金融版上发表了这样一个问题帖 我怎样才能嫁给有钱人 我下面要说的都是心里话 本人 25 岁 非常漂亮 谈吐文雅 有品位 想嫁给年薪 50 万美元的人 你也许会说我贪心 但在纽约年薪 100 万才算
  • YOLOV7详细解读(三)技术要点归纳

    YOLOV7技术要点归纳 技术要点归纳 YOLOV7技术要点归纳 前言 一 YOLOV7是什么 二 论文贡献 三 相关工作 四 网络架构 五 重参数化 六 模型缩放 七 E ELAN 结构图 分组卷积 八 损失函数 九 动态标签分配策略 步
  • Kubernetes Deployment

    Deployment是Kubernetes1 2引入的新概念 引入的目的是为了更好的解决Pod的编排问题 为此Deployment内部使用了Replica Set来实现目的 Deployment 相对于RC的一个最大升级是我们可以随时知道当

随机推荐

  • 使用Rider断点调试lua代码

    记录一下 新建调试配置 在 Rider 工具栏的 Debug Config 中点击 Editor Configigurations 然后点击 号 新建一个 Emmy Debugger NEW 输入调试器名字为 Tcp Debugger co
  • Linux中cmake指定特定版本gcc

    最近因为服务器上有多个gcc 编译llvm的时候需要使用5 1以上的 但是由于默认目录 usr bin下的gcc是4 8 5 在另外的目录下有一个7 3 1的 cmake默认使用老版本的gcc 导致cmake失败 报错 输入which gc
  • websocked基础

    websocked基础 http与websocked区别 http websocked websocked特点 如何使用websocked 补充blob对象或Arraybuffer对象 http与websocked区别 http 只能由客户
  • cannot find reference ‘keras’ in ‘__init__.py‘

    文章目录 起因 原因 解决办法 参考来源链接 起因 在网上找了开源代码 之前看的都是jupyter notebook编写的 今天用pycharm调试一个开源程序 发现总是不能调试 检查了好几遍编译环境都没问题 运行正常 就是不能调试 报错是
  • 早期计算机语言称为,程序设计语言是软件的基础和组成部分,也称为计算机语言...

    原标题 程序设计语言是软件的基础和组成部分 也称为计算机语言 程序是对计算任务的处理对象和处理规则的描述 必须装入计算机内部才能工作 没有操作系统 系统无用 程序设计语言是软件的基础和组成部分 也称为计算机语言 定义计算机程序的语法规则 由
  • torch.nn.Linear()函数讲解

    函数讲解 in features指的是输入的二维张量的大小 即输入的 batch size size 中的size out features指的是输出的二维张量的大小 即输出的二维张量的形状为 batch size output size
  • 【Matlab】智能优化算法_灰狼优化算法GWO

    Matlab 智能优化算法 灰狼优化算法GWO 1 背景介绍 2 基本思想 2 1 等级制度 2 2 狩猎方式 3 公式推导 3 1 社会等级制度 3 2 包围猎物 3 3 包围猎物 3 4 攻击猎物 3 5 搜索猎物 4 算法流程图 5
  • 史上最详细springboot vue UEditor整合(包括遇到的各种坑)

    Vue中引入UEditor看这篇教程https blog csdn net kshon article details 102667318 接下来说说springboot中配置UEditor遇到的各种坑 1 将UEditor中目录下的con
  • IM即时通讯-推荐框架

    CIM https gitee com farsunset cim CIM是一套基于mina或netty框架下的推送系统 或许有一些企业有着自己一套即时通讯系统的需求那么CIM为您提供了一个解决方案 目前CIM支持websocket and
  • java map取第一个元素_java常用对象Map集合中关于取出元素的说明

    之前在上一篇 java常用对象API中集合框架之Map的用法 文章中简单的例举了一些Map集合中的一些简单方法和一些常用的子类 那么本章将对例举的方法和子类进行一一的详细说明和举例 这样也是为了让更多的朋友们学习java能够得到另一种启发而
  • 将手机、平板变成电脑第二屏

    将手机 平板变成电脑第二屏 过年回家了 带着大包小包 显示器总不能再带在身上吧 常年双屏使用者 当没有了双屏 感觉很难受 于是找到了开源项目deskreen Deskreen 是一款桌面应用程序 可以通过 WiFi 局域网下 将任何带有浏览
  • 华为OD机试 Python 【恢复数字序列】

    描述 给你一个由正整数拼接而成的字符串 但中间有些字符位置被打乱了 比如原来有 89101112 它可能被打乱为 90811211 这时整数10就变成了0和1两部分 请你找出原始字符串中的最小正整数是什么 输入 一行 包括被打乱的字符串和原
  • RabbitMQ 消息丢失的场景,如何保证消息不丢失?

    一 RabbitMQ消息丢失的三种情况 第一种 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候 可能数据就在半路给搞丢了 因为网络问题啥的 都有可能 第二种 RabbitMQ 弄丢了数据 MQ还没有持久化自己挂了 第三种 消
  • 【C#】.Net 腾讯云一句话识别 【实例】

    腾讯云一句话识别实例 using System using System Threading Tasks using TencentCloud Common using TencentCloud Common Profile using T
  • 编写高质量代码:改善Java程序的151个建议(第10章:性能和效率,第11章:开源世界,第12章:思想为源___建议132~151)...

    第10章 性能和效率 建议132 提升Java性能的基本方法 建议133 若非必要 不要克隆对象 建议134 推荐使用 望闻问切 的方式诊断性能 建议135 必须定义性能衡量标准 建议136 枪打出头鸟 解决首要系统性能问题 建议137 调
  • 素数筛【朴素,埃氏,欧拉】(持续优化ing)

    一 朴素筛法 定义部分说明 int prime 11000 存素数 int ans 0 计数 计prime数组中有多少个素数 代码实现部分 void getPrime int n prime ans 2 for int i 3 i lt n
  • Docker开发指南(自用)

    Docker开发指南 自用 本指南总结归纳菜鸟教程上的常用指令 并在文末给出了一个应用实例 序言 Docker是什么 Docker 是一个开源的应用容器引擎 基于 Go 语言 并遵从 Apache2 0 协议开源 Docker 可以让开发者
  • 【C语言练习题】计算1 * 2 * 3+3 * 4 * 5+5 * 6 * 7+...+99 * 100 * 101的值。

    计算1 2 3 3 4 5 5 6 7 99 100 101的值 错误版本 循环结束后仍执行i i 多余 include
  • 金融风控反欺诈之图算法

    先介绍下金融借贷业务流程 用户前来申请借贷 会先经过欺诈识别 把欺诈团伙和主观欺诈的个人拒绝掉 然后对通过的人做信用评估 最后根据额度模型 算出利润最大化时放款金额 刚才提到了团队欺诈 举个真实的例子 宜人贷在他们的财报中公布的 他们被一个
  • BFS和DFS代码实现

    BFS DFS实现图的遍历 以以下图数据为例 首先BFS是广度优先遍历算法 从图的某一个节点出发 然后遍历完这个节点相邻的节点 这个算法的核心就是 先把周围的找完 再去找更深的地方 通俗易懂的说法 DFS就是一条路走到底 发现没路了 返回来