图的深度和广度优先搜索

news2024/11/14 17:45:43

        图的遍历有深度优先搜索和广度优先搜索两种

        深度优先搜索

       类似于树的先根遍历,但图不同于树的地方在于,它可能存在回路/环,那么在进行遍历的时候,同一个顶点可能会被多次搜索到,如果一个顶点被访问过了,要进行标记,当它再次被搜索到,不再对其进行访问。图的深度优先遍历的过程是,任意选定一个顶点,访问它,然后依次对它的邻接顶点进行深度优先遍历,这是一个递归的过程,通过深度优先访问到的顶点都是第一个选定的顶点能够到达的顶点,但图有可能不是联通的,所以当选定一个顶点进行深度优先遍历的时候,不一定能够把所有的顶点都给搜索到,因此有可能需要进行多次深度优先遍历。通过上面的叙述,我们需要1)设定一个visited向量来标记顶点是否被访问过,2)给出一个方法计算指定顶点的邻接点 3)确保所有的顶点被访问到,可能要多次执行深度优先遍历操作。这里还要说一下计算顶点的邻接点,对于无向图来说没什么,但对于有向图,一个顶点的邻接点取顶点邻接到的顶点序列还是取顶点邻接到的顶点序列加上邻接自的顶点序列,取决于实现,都可以。

        广度优先搜索

        类似于树的层次遍历,同样需要标记顶点,避免已经访问过的顶点再次被访问。层次遍历的逻辑很简单,只要借助于一个辅助队列进行。

       下面给出一个代码实现对下图的遍历,图的存储表示采用邻接表形式,其他存储表示的图的遍历逻辑也差不多,就不一一实现了。

 

from collections import deque
class Vertex:
    def __init__(self, data = None):
        self.data = data
        self.in_arcs = []
        self.out_arcs = []

    def set_in_arc(self, v):
        self.in_arcs.append(v)

    def set_out_arc(self, v):
        self.out_arcs.append(v)

    def __str__(self):
        return str(self.data)

class Graph:
    def __init__(self, vertexs = None):
        self.vertexs = [i for i in vertexs] if vertexs else []
    
    def insert_vertex(self, vertex):
        self.vertexs.append(vertex)

    def set_in_arc(self, i, j):
        vertex = self.vertexs[i]
        vertex.set_in_arc(j)

    def set_out_arc(self, i, j):
        vertex = self.vertexs[i]
        vertex.set_out_arc(j)

    def set_out_arcs(self, i, arcs):
        for j in arcs:
            self.set_out_arc(i, j)

    def set_in_arcs(self):
        for i, v in enumerate(self.vertexs):
            for j in v.out_arcs:
                self.vertexs[j].set_in_arc(i)

    def get_in_arcs(self, i):
        return [(j, i) for j in self.vertexs[i].in_arcs]

    def get_out_arcs(self, i):
        return [(i, j) for j in self.vertexs[i].out_arcs]

    def dfstraverse(self):
        vertexs = self.vertexs
        visited = [0] * len(vertexs)
        def dfs(i):
            nonlocal visited
            visited[i] = 1
            yield vertexs[i]
            for _, j in self.get_out_arcs(i):
                if not visited[j]:
                    yield from dfs(j)
        for i in range(len(vertexs)):
            if not visited[i]:
                yield from dfs(i)

    def bfstraverse(self):
        q = deque()
        vertexs = self.vertexs
        visited = [0] * len(vertexs)
        for i in range(len(vertexs)): 
            if not visited[i]:
                yield vertexs[i]
                visited[i] = 1
                q.append(i)
                while q:
                    j = q.popleft()
                    for _, k in self.get_out_arcs(j):
                        if not visited[k]:
                            yield vertexs[k]
                            visited[k] = 1
                            q.append(k)


g = Graph()
_ = [g.insert_vertex(Vertex(i)) for i in "A B C D E F G H I J K L M".split()]
g.set_out_arcs(0, (11, 5, 2, 1))
g.set_out_arcs(1, (12, 0))
g.set_out_arcs(2, (0,))
g.set_out_arcs(3, (4,))
g.set_out_arcs(4, (3,))
g.set_out_arcs(5, (0,))
g.set_out_arcs(6, (10, 8, 7))
g.set_out_arcs(7, (10, 6))
g.set_out_arcs(8, (6,))
g.set_out_arcs(9, (12, 11))
g.set_out_arcs(10, (7, 6))
g.set_out_arcs(11, (12, 9, 0))
g.set_out_arcs(12, (11, 9, 1))
for i in g.dfstraverse():
    print(i)
print("____________")
for i in g.bfstraverse():
    print(i)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券股市资讯:A股利好,密集发布!

6月24日晚,回购商场再扎堆。不少公司发布过亿元回购计划。从回购用处看,不少公司回购用于刊出以削减公司注册资本,提振投资者决心。 值得一提的是,一些公司为了加大回购力度,将回购施行期限进行延伸。还有的公司添加了…

厄瓜多尔海外媒体发稿:大舍传媒-媒体宣发投放需要什么条件?

一、厄瓜多尔媒体 厄瓜多尔媒体有: EcuapaginasEcuapuntoViviendaya 这些媒体都是厄瓜多尔当地颇具影响力的新闻**和社交媒体平台,为广告主和品牌提供了一个广阔的宣传空间。 二、大舍传媒介绍 大舍传媒是一家专业的海外媒体宣发投放,致…

行业发展:面向电子元件的先进包装材料

许多高性能的材料现在可用于电子外壳和包装,可以提供比传统选择的优势。这些材料大多是先进的复合材料,更轻,更耐候性,具有更好的热性能。 一些先进材料的热导率是铜的四倍以上。这样做的好处包括改进的热设计,以及消…

现在的Java面试都这么扯淡了吗?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!开发兼过半年面试官 刚开始…

使用AES,前端加密,后端解密,spring工具类,直接c就完事了

学习python的时候,看到很多会对参数进行加密,于是好奇心驱使下,让我去了解了下AES加密如何在java中实现。 首先 npm install crypto-js 然后在你的方法中,给你们前端源码看看,因为我用的ruoyi框架做的实验&#xff…

怎么用表单二维码来收集信息?二维码收集信息的制作教程

现在通过二维码来收集用户信息的方式在很多场景中都有应用,随着毕业季的到来学校也开始用这种方式来收集学生的个人信息,学生只需要扫描生成二维码,根据问题填写对应的内容,将数据统计到专门的后台中存储,实现数据的快…

docker-compose部署Flink及Dinky

docker-compose部署Flink及Dinky 服务器环境:centos7 1. 配置hosts vim /etc/hostsx.x.x.x jobmanager x.x.x.x taskmanager x.x.x.x dinky-mysql2. 文件目录结构 . ├── conf │ ├── JobManager │ │ ├── flink-conf.yaml │ │ ├── log…

关于无人机——你知道有哪些种类?

随着无人机相关技术的飞速发展,无人机的种类也越来越多。也正由于无人机的多样性,从不同的角度考量会有不同的分类方法: 按照飞行平台构型分类,无人机可分为固定翼无人机、旋翼无人机、无人飞艇、伞翼无人机、扑翼无人机等。 按…

使用多用户增强服务器的安全性

Fedora CoreOS 操作系统 (简称 fcos) 的主要设计目标, 是大规模服务器集群 (几十台甚至数百台). 对于窝等穷人这种只有一台主机 (或者两三台) 的情况, 还是需要稍稍改造 (配置) 一下, 才能比较舒服的使用. 比如, 默认 SSH 登录使用 core 用户, 这个用户可以无需密码使用 sudo …

贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践

摘要:本文投稿自贝壳家装数仓团队,在结合家装业务场景下所探索出的一种基于 FlinkPaimon 的排序方案。这种方案可以在实时环境对全量数据进行准确的分组排序,同时减少对内存资源的消耗。在这一方案中,引入了“事件时间分段”的概念…

k8s设置pod资源请求和限制

设置资源请求和限制 实验目标: 学习如何为 Pod 设置资源请求和限制,以优化集群资源分配。 实验步骤: 创建一个 Deployment,并设置 CPU 和内存的资源请求和限制。使用 kubectl describe 命令查看资源分配情况。观察资源限制对 P…

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)将于2024年8月2-4日在中国厦门召开。ICVISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域, 为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提…

Linux常用基本命令

linux目录 1.查看linux本机ip ip addr 2.新建文件夹 mkdir 文件夹名 3.新建文件 touch 文件名.后缀 4.删除文件 rm 文件名.后缀 5.删除文件 rm -r 文件名 6.不询问直接删除 rm -rf 文件名/文件名/ 7.显示目录下文件,文件夹 作用:显示指定目…

鸿蒙应用开发 - 软件安装 - DevEco

第一步 前往下载点下载安装包下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态https://developer.huawei.com/consumer/cn/download/ 根据自身需求下载对应安装包 第二步 点击打开安装包,配置安装路径 我个人选择放E盘,避免占用c盘空间 第三步 …

00_Python核心编程

Python入门 一 Python初识 1 Python的历史 Python的历史python是蟒蛇的含义python是一种解释型的,面向对象的,带有动态语义的高级程序设计语言. python是一种使你在编程时能够保持自己的风格的程序设计语言,你不用费什么劲就可以实现你想要的功能,并且编写的程序清晰易懂. …

宠物空气净化器哪家强?希喂、小米、安德迈谁最具性价比?

猫咪掉毛是一种正常的生理现象,每只猫咪都会周期性地更换毛发。但是,当您发现家里的沙发、地毯、衣物、甚至空气中都漂浮着难以清理的猫浮毛时。还是会很烦恼,最重要的是空气中的浮毛如果不及时清理的话长时间停留在空气中会对身体造成一定威…

苏州大学气膜综合馆成为师生活动新中心—轻空间

苏州大学应用技术学院的气膜综合馆自建成以来,已成为校园内的热门活动场所。由轻空间(江苏)膜科技有限公司(以下简称“轻空间”)全力打造,这座现代化、环保的多功能运动场馆,不仅为师生提供了一…

小米汽车SU7全色系H5自适应展示源码

为了满足广大车迷和潜在消费者对小米汽车SU7全色系的视觉体验需求,我们特别推出了一款基于HTML的自适应H5源码,用于在线展示小米汽车SU7的全色系。这款源码不仅兼容各种设备和屏幕尺寸,而且能够完美地呈现出小米汽车SU7的优雅外观和精致细节。…

vue3-openlayers 轨迹回放(历史轨迹)(ol-animation-path实现)

本篇介绍一下使用vue3-openlayers轨迹回放(历史轨迹)(ol-animation-path实现) 1 需求 轨迹回放(历史轨迹)实时轨迹 2 分析 轨迹回放(历史轨迹),一般是一次性拿到所有…

高效记录收支明细:揭秘如何通过曲线图精准分析每月开销

在理财的道路上,你是否曾感到迷茫和无力?每个月的开销如同流水般悄无声息地滑过指尖,但你却始终难以掌握自己的财务脉络。今天,我们为你揭秘一个全新的理财方法——通过曲线图精准分析每月开销,让你的财务生活焕发智慧…