U4_1:图论之DFS/BFS/TS/Scc

文章目录

  • 一、图的基本概念
  • 二、广度优先搜索(BFS)
    • 记录
    • 伪代码
    • 时间复杂度
    • 流程
    • 应用
  • 三、深度优先搜索(DFS)
    • 记录
    • 伪代码
    • 时间复杂度
    • 流程
    • 时间戳结构
    • BFS和DFS比较
  • 四、拓扑排序
    • 一些概念
      • 有向图
      • 作用
      • 拓扑排序
    • 分析
    • 伪代码
    • 时间复杂度
    • 彩蛋
  • 五、强连通分量-SCC
    • 分析
    • 伪代码
    • 时间复杂度

一、图的基本概念

由点(vertices)和边(edges)组成
G = ( V , E ) G=(V,E) G=(V,E) ∣ V ∣ = n |V|=n V=n, ∣ E ∣ = m |E|=m E=m (这里默认有向图,无向图用 G G G = = ={ V V V, E E E}表示

顶点的度是关联在其上的边的数量。满足 ∑ d e g r e e ( v ) = 2 ∣ E ∣ \sum degree(v)=2|E| degree(v)=2∣E(握手定理)

路径:一个序列 < V 0 , V 1 , . . . , V k > <V_0,V_1,...,V_k> <V0,V1,...,Vk> i = 1 , 2 , . . . , k i=1,2,...,k i=1,2,...,k满足 ( V i − 1 , V i ) (V_{i-1},V_i) (Vi1,Vi),序列中任意两点之间都是可达的。
简单路径:序列中所有顶点都是不同的。

环:一个路径 < V 0 , V 1 , . . . , V k > <V_0,V_1,...,V_k> <V0,V1,...,Vk>并且 V 0 = V k V_0=V_k V0=Vk并且路径上所有边都是不同的
简单环: V 1 , V 2 , . . . , V k V_1,V_2,...,V_k V1,V2,...,Vk是不同的。

连通:两个点之间存在路径。每个顶点对之间都连通,则这个图是连通的

连通分量:两点之间连通的最大集合的个数(等价类)。如下图:
在这里插入图片描述
子图: G ′ G' G的点和边都属于 G G G
诱导子图: G ′ G' G的点属于 G G G,且连接点的所有边都要属于 G ′ G' G

在这里插入图片描述

邻接表Adj:用链表连接每个点的边。因此是遍历了每个点和每条边,因此时间复杂度 T ( n ) = O ( V + E ) T(n)=O(V+E) T(n)=O(V+E)
在这里插入图片描述
邻接矩阵: A = [ a i j ] , a i j = 1 A=[a_{ij}],a_{ij}=1 A=[aij],aij=1   i f ( v i , v j ) 属于 E if(v_i,v_j)属于E if(vi,vj)属于E,否则 a i j = 0 a_{ij}=0 aij=0
因为不管怎样任意两点间有无边都要判断一遍,因此时间复杂度 T ( n ) = O ( V 2 ) T(n)=O(V^2) T(n)=O(V2)
在这里插入图片描述

二、广度优先搜索(BFS)

用处:遍历图中的所有顶点,从而显示图的属性

记录

三个数组用于保存遍历期间收集的信息。

  1. c o l o r [ u ] color[u] color[u]:访问的每个顶点的颜色
    W H I T E WHITE WHITE:未发现
    G R A Y GRAY GRAY:已发现但未完成处理
    B L A C K BLACK BLACK:已完成处理
  2. p r e d [ u ] pred[u] pred[u]:前一个指针:指向发现u的顶点
  3. d [ u ] d[u] d[u]:从源到顶点u的距离

伪代码

BFS(G)
for u in V docolor[u] ← WHITE;pred[u] ← NULL;
end
for u in V doif color[u] is equal to WHITE thenBFSVisit(u);end
endBFSVisit(s)
color[s] ← GRAY,d[s] ← 0;
set Q a queue
Enqueue(Q,s)
while Q is not empty dou ← Dequeue(Q)for v is belong to Adj[u] do   (邻接表遍历的)if(color[v] = WHITE) thencolor[u] ← GRAYd[v] ← d[u]+1pred[v] ← uEnqueue(Q,v)endendcolor[u] ← BLACK
end

时间复杂度

每一次循环遍历,都是遍历一个点和其边,且边遍历过了其他边就不会再遍历,因此
T ( n ) = ∑ O ( 1 + d e g r e e ( u ) ) = O ( V + E ) T(n)=\sum O(1+degree(u))=O(V+E) T(n)=O(1+degree(u))=O(V+E)

流程

一次BFSVisit,能将连通分量遍历完
在这里插入图片描述

应用

  1. 最短路径问题
  2. 查找连通分量

三、深度优先搜索(DFS)

用处:同样也是遍历图中的所有顶点,从而显示图的属性

记录

四个数组用于保存遍历期间收集的信息。

  1. c o l o r [ u ] color[u] color[u]:访问的每个顶点的颜色
    W H I T E WHITE WHITE:未发现
    G R A Y GRAY GRAY:已发现但未完成处理
    B L A C K BLACK BLACK:已完成处理
  2. p r e d [ u ] pred[u] pred[u]:前一个指针:指向发现u的顶点
  3. d [ u ] d[u] d[u]:发现时间。(设置一个全局变量时间发生器)
  4. f [ u ] f[u] f[u]:结束时间。一个计数器,指示顶点u(及其所有后代)的处理何时完成

伪代码

DFS(G)
for u in V docolor[u] ← WHITE;pred[u] ← NULL;
endtime  ← 0
for u in V doif color[u] is equal to WHITE thenDFSVisit(u);end
endDFSVisit(u)
color[u] ← GRAY,d[u] ← ++time;
set Q a queue
Enqueue(Q,s)
for v is belong to Adj[u] do   (邻接表遍历的)if(color[v] = WHITE) thenpred[v] ← uDFSVisit(v)end
end
color[u] ← BLACK
f[u] ← ++time;

时间复杂度

同样,每一次循环遍历,都是遍历一个点和其边,且边遍历过了其他边就不会再遍历,因此
T ( n ) = ∑ O ( 1 + d e g r e e ( u ) ) = O ( V + E ) T(n)=\sum O(1+degree(u))=O(V+E) T(n)=O(1+degree(u))=O(V+E)

流程

在这里插入图片描述

时间戳结构

在这里插入图片描述
由图可知, u u u v v v的后代(在 D F S DFS DFS树中),当且仅当 [ d [ u ] , f [ u ] ] [d[u],f [u]] [d[u],f[u]] [ d [ v ] , f [ v ] ] [d[v],f [v]] [d[v],f[v]]的子区间

树边: i f ( u , v ) ∈ E f if (u, v)∈E_f if(u,v)Ef等价 u = p r e d [ v ] u = pred[v] u=pred[v],即 u u u D F S DFS DFS树中 v v v的前身(图中蓝色边)
后边缘:如果 v v v D F S DFS DFS树中 u u u的祖先(不包括前身)(图中红色边)
有边就有祖先和后代的关系
在这里插入图片描述

BFS和DFS比较

BFS是发现点之后先处理,DFS是发现点之后不处理,继续往下去找其他的点。

四、拓扑排序

一些概念

有向图

有向图,区分边(u, v)和边(v, u)
顶点的出界度是离开它的边的数量,顶点的入界度是进入它的边的数量
每条边(u, v)对u的出阶贡献1次,对v的入阶贡献1次
∑ o u t − d e g r e e ( v ) = ∑ i n − d e g r e e ( v ) = ∣ E ∣ \sum out-degree(v)=\sum in-degree(v)=|E| outdegree(v)=indegree(v)=E

作用

有向图通常用于表示顺序相关的任务,也就是说,我们不能在另一个任务完成之前启动一个任务。
边(u, v)表示任务u完成后才能启动任务v。
显然,要使系统不挂起,图必须是无环的,它必须是有向无环图(或DAG)

拓扑排序

拓扑排序是一种针对有向无环图的算法,对顶点进行线性排序,使得对于DAG中的每条边(u, v), u在线性排序中出现在v之前。
它可能不是唯一的,因为有许多“不兼容”的元素。

分析

  1. 起始顶点入度必须为0,如果这样的顶点不存在,图就不是无环的。
  2. 一个入度为0的顶点是一个可以马上开始的任务。所以我们可以先以线性顺序输出它.
  3. 如果输出一个顶点u,那么所有的边(u, v)都不再有用,因为任务v不再需要等待u。
  4. 去掉顶点u后,新图仍然是一个有向无环图
  5. 重复步骤2-4,直到没有顶点留下

伪代码

Initialize Q to be an empty queue
for u is belong to V do thenif u.in_degree is equal to 0 thenEnqueue(Q,u)end
end
while Q is not empty dou ← Dequeue(Q)Output u;for v is belong to Adj(u) dov.in_degree ← v.in_degree-1if v,in_degree is equal to 0 thenEnqueue(Q,v)endend
end

时间复杂度

依旧是每条边和每个顶点都遍历一遍,因此时间复杂度 T ( n ) = O ( V + E ) T(n)=O(V+E) T(n)=O(V+E)

彩蛋

也可用DFS求出拓扑序列,对于每个有向边,都有 f [ u ] > f [ v ] f[u]>f[v] f[u]>f[v]

在时间O(V+E)内计算出 D A G DAG DAG(有向无环图)中的单源最短路径:动态规划

五、强连通分量-SCC

任意两点之间都有路径,再增加一个点都不满足这个关系。
任何两个强连通分量交集都为空
在这里插入图片描述
找到一个算法,求一个图得所有连通分量

分析

  1. 对G中所有边的方向进行反转,得到逆图GR。
  2. 执行DFS,并获得GR中顶点变黑的序列,即每当一个顶点从堆栈中弹出时,将其附加到序列 L R L^R LR中,将 L R L^R LR倒序得到序列L
  3. 对原图G执行DFS,规则如下
    规则1:从L的第一个顶点开始DFS
    规则2:当需要重新开始时,从L的第一个仍然是白色的顶点开始
    将每个dfs树中的顶点输出为SCC
    在这里插入图片描述

伪代码

R ← {}
Reverse G and get G'
DFS G' and get L'
reverse L' and get L
for u属于L doif color[u] is WHITE thenLscc ← DFSVisit(G,u)R ← RUSet(Lscc)end
end

时间复杂度

翻转边需要遍历每个点和边,时间复杂度为 O ( V + E ) O(V+E) O(V+E),DFS时间复杂度为 O ( V + E ) O(V+E) O(V+E),,然后还是依次遍历每个点和边,时间复杂度也是 O ( V + E ) O(V+E) O(V+E),因此总时间复杂度为 T ( n ) = O ( V + E ) T(n)=O(V+E) T(n)=O(V+E)

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

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

相关文章

使用 ClickHouse 做日志分析

原作&#xff1a;Monika Singh & Pradeep Chhetri 这是我们在 Monitorama 2022 上发表的演讲的改编稿。您可以在此处找到包含演讲者笔记的幻灯片和此处的视频。 当 Cloudflare 的请求抛出错误时&#xff0c;信息会记录在我们的 requests_error 管道中。错误日志用于帮助解…

【DevOps】Git 图文详解(六):Git 利器 - 分支

Git 利器 - 分支 1.分支 Branch2.分支指令 &#x1f525;3.分支的切换 checkout4.合并 merge & 冲突4.1 &#x1f538; 快速合并&#xff08;Fast forward&#xff09;4.2 &#x1f538; 普通合并4.3 处理冲突 <<<<<<< HEAD 5.变基 rebase 分支是从主…

linux rsyslog综合实战2

本次我们通过rsyslog服务将A节点服务器上的两个(E.g:多个日志也可以)日志(Path:/var/log/245-1.log、245-2.log)实时同步到B节点服务器目录下(Path:/opt/rsyslog/245) 1.rsyslog架构 2.环境信息 环境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.245CentOS…

2023 最新 PDF.js 在 Vue3 中的使用(长期更新)

因为自己写业务要定制各种 pdf 预览情况&#xff08;可能&#xff09;&#xff0c;所以采用了 pdf.js 而不是各种第三方封装库&#xff0c;主要还是为了更好的自由度。 一、PDF.js 介绍 官方地址 中文文档 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区…

基于51单片机音乐盒LCD1602显示( proteus仿真+程序+原理图+设计报告+讲解视频)

基于51单片机音乐盒LCD1602显示( proteus仿真程序原理图设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0065 音乐盒 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真…

Polygon Miden VM架构总览

1. 计算类型 Programs程序有2种类型&#xff1a; 1&#xff09;Circuit电路&#xff1a;即&#xff0c;程序即电路。将程序转换为电路。2&#xff09;Virtual machine虚拟机&#xff1a;即&#xff0c;程序为电路的输入。【Miden VM属于此类型】 2. 何为ZK virtual machine…

探索 Material 3:全新设计系统和组件库的介绍

探索 Material 3&#xff1a;全新设计系统和组件库的介绍 一、Material 3 简介1.1 Material 3 的改进和更新1.2 Material 3 的优势特点 二、Material 3 主题使用2.1 使用 Material3 主题2.2 使用 Material3 主题颜色 三、Material 3 组件使用3.1 MaterialButton&#xff1a;支持…

实验(四):指令部件实验

一、实验内容与目的 实验要求&#xff1a; 利用CP226实验仪上的小键盘将程序输入主存储器EM&#xff0c;通过指令的执行实现微程序控制器的程序控制。 实验目的&#xff1a; 1.掌握模型机的操作码测试过程&#xff1b; 2.掌握模型机微程序控制器的基本结构以及程序控制的基本原…

界面控件DevExpress WPF流程图组件,完美复制Visio UI!(一)

DevExpress WPF Diagram&#xff08;流程图&#xff09;控件帮助用户完美复制Microsoft Visio UI&#xff0c;并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至…

pytorch中.to(device) 和.cuda()的区别

在PyTorch中&#xff0c;使用GPU加速可以显著提高模型的训练速度。在将数据传递给GPU之前&#xff0c;需要将其转换为GPU可用的格式。 函数原型如下&#xff1a; def cuda(self: T, device: Optional[Union[int, device]] None) -> T:return self._apply(lambda t: t.cuda…

steamui.dll找不到指定模块,要怎么修复steamui.dll文件

当我们使用Steam进行游戏时&#xff0c;有时可能会面对一些令人无奈的技术问题。一种常见的问题是“找不到指定模块steamui.dll”&#xff0c;这可能是由于缺少文件、文件损坏或软件冲突等原因导致。但别担心&#xff0c;这篇文章将提供几种解决此问题的方法&#xff0c;并针对…

Apache Airflow (十三) :Airflow分布式集群搭建及使用-原因及

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

线程池[重点]

线程池概述 线程池就是一个可以复用线程的技术。 不使用线程池的问题 &#xff1a;如果用户每发起一个请求&#xff0c;后台就创建一个新线程来处理&#xff0c;下次新任务来了又要创建新线程&#xff0c;而创建新线程的开销是很大的&#xff0c;这样会严重影响系统的性能。 …

身为程序员哪一个瞬间让你最奔溃 ?

身为程序员&#xff0c;有时候最让我感到沮丧的瞬间之一是遇到难以追踪和解决的 Bug。这些 Bug 可能出现在我写的代码中&#xff0c;也可能是由于不可预测的外部因素引起的。其中一个让我最奔溃的瞬间是在一个大型项目中&#xff0c;我遇到了一个非常复杂的Bug&#xff0c;这个…

Linux--网络概念

1.什么是网络 1.1 如何看待计算机 我们知道&#xff0c;对于计算机来说&#xff0c;计算机是遵循冯诺依曼体系结构的&#xff08;即把数据从外设移动到内存&#xff0c;再从内存到CPU进行计算&#xff0c;然后返回内存&#xff0c;重新读写到外设中&#xff09;。这是一台计算机…

HCIP-一、RSTP 特性及安全

一、RSTP 特性及安全 实验拓扑实验需求及解法 实验拓扑 实验需求及解法 //1.SW1/2/3是企业内部交换机&#xff0c;如图所示配置各设备名称。 //2.配置VLAN&#xff0c;需求如下&#xff1a; //1&#xff09;SW1/2/3创建vlan10 [SW1]vlan batch 10 [SW2]vlan batch 10 [SW3]vla…

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址&#xff1a;https://hugegraph.apache.org/ 环境为&#xff1a;linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…

机器视觉技术在现代汽车制造中的应用

原创 | 文 BFT机器人 机器视觉技术&#xff0c;利用计算机模拟人眼视觉功能&#xff0c;从图像中提取信息以用于检测、测量和控制&#xff0c;已广泛应用于现代工业&#xff0c;特别是汽车制造业。其主要应用包括视觉测量、视觉引导和视觉检测。 01 视觉测量 视觉测量技术用于…

分布式系统的认证授权

一.分布式系统的认证授权大致架构 以云音乐系统为例&#xff1a; 注&#xff1a;一般情况下&#xff0c;我们会把认证的部分的接口提取为一个单独的认证服务模块中。 二.单点登录&#xff08;Single Sign On&#xff09; 单点登录&#xff0c;Single Sign On&#xff0c;简称…