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.rhkb.cn/news/200585.html

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

相关文章

复杂数据统计与R语言程序设计实验一

1.下载并安装R语言软件&#xff0c;熟悉基本操作的命令及操作界面&#xff0c;掌握软件的使用方法&#xff08;提供学号加姓名的截图&#xff09;。 2.下载并安装Rstudio&#xff0c; &#xff08;提供运行代码及运行结果的截图&#xff09;。 3.下载并安装R包DT&#xff0c;…

树莓派的的串口通信协议

首先&#xff0c;回顾一下串口的核心知识点&#xff0c;也是面试重点&#xff1a; 串口通信通常使用在多机通讯中串口通信是全双工的决定串口通信的成功与否的是 数据格式 和 波特率数据格式&#xff1a;1. 数据位 2.停止位 3. 奇偶校验位 树莓派恢复串口 回忆前几节树莓派刷机…

Tensorrt 实现 yolov5-cls 遇到的问题

yolov5-6.2增加了分类训练、验证、预测和导出&#xff08;所有 11 种格式&#xff09;&#xff0c;还提供了 ImageNet 预训练的 YOLOv5m-cls、ResNet&#xff08;18、34、50、101) 和 EfficientNet (b0-b3) 模型. 官方Git : https://github.com/ultralytics/yolov5 分类模型与…

企业微信将应用安装到工作台

在上篇中介绍了配置小程序应用及指令、数据回调获取第三方凭证&#xff1b; 本篇将介绍如何将应用安装到企业工作台。 添加测试企业 通过【应用管理】->【测试企业配置】添加测试企业。 通过企业微信扫描二维码添加测试企业。 注意&#xff1a;需要扫描的账号为管理员权限…

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染 Gin HTML 模板渲染 1. 全部模板放在一个目录里面的配置方法 创建用于渲染的模板html templates/index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> …

【云原生-Kurbernetes篇】HPA 与 Rancher管理工具

文章目录 一、Pod的自动伸缩1.1 HPA1.1.1 简介1.1.2 HPA的实现原理1.1.3 相关命令 1.2 VPA1.2.1 简介1.2.2 VPA的组件1.2.3 VPA工作原理 1.3 metrics-server简介 二、 HPA的部署与测试2.1 部署metrics-serverStep1 编写metrics-server的配置清单文件Step2 部署Step3 测试kubect…

数学几百年重大错误:将两异函数误为同一函数

黄小宁 因各实数都可是数轴上点的坐标所以数集A可形象化为数轴上的点集A&#xff0c;从而使x∈R变换为实数yxδ的几何意义可是&#xff1a;一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)运动到新的位置yxδ还在管道g内&#xff08;设各点只作位置改变而没别的改变即变位前…

『亚马逊云科技产品测评』活动征文|搭建Squoosh图片在线压缩工具

搭建Squoosh图片在线压缩工具 前言一、Squoosh是什么&#xff1f;二、准备一台Lightsail实例1.进入控制台2.创建实例3.开放端口4.部署Squoosh5.预览 三、搭建反向代理1. 安装宝塔2. 配置反向代理3. 预览代理效果 提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马…

2021秋招-总目录

2021秋招-目录 知识点总结 预训练语言模型: Bert家族 1.1 BERT、attention、transformer理解部分 B站讲解–强烈推荐可视化推倒结合代码理解代码部分常见面试考点以及问题: word2vec 、 fasttext 、elmo;BN 、LN、CN、WNNLP中的loss与评价总结 4.1 loss_function&#xff1…

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…

激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

SPASS-指数平滑法

基本概念及统计原理 基本概念 指数平滑法的思想来源于对移动平均预测法的改进。指数平滑法的思想是以无穷大为宽度&#xff0c;各历史值的权重随时间的推移呈指数衰减&#xff0c;这样就解决了移动平均的两个难题。 统计原理 简单模型 Holt线性趋势模型 案例 为了研究上海市…

HarmonyOS ArkTS List组件和Grid组件的使用(五)

简介 ArkUI提供了List组件和Grid组件&#xff0c;开发者使用List和Grid组件能够很轻松的完成一些列表页面。常见的列表有线性列表&#xff08;List列表&#xff09;和网格布局&#xff08;Grid列表&#xff09;&#xff1a; List组件的使用 List是很常用的滚动类容器组件&…

Ghidra逆向工具配置 MacOS 的启动台显示(Python)

写在前面 通过 ghidra 工具, 但是只能用命令行启动, 不太舒服, 写个脚本生成 MacOS 的 app 格式并导入启动台. 不算复杂, 主要是解析包的一些元信息还有裁剪软件图标(通过 MacOS 自带的 API) 脚本 #!/opt/homebrew/bin/python3import os import re import subprocess as sp…

易航网址引导系统 v1.9 源码:去除弹窗功能的易航网址引导页管理系统

易航自主开发了一款极其优雅的易航网址引导页管理系统&#xff0c;后台采用全新的光年 v5 模板开发。该系统完全开源&#xff0c;摒弃了后门风险&#xff0c;可以管理无数个引导页主题。数据管理采用易航原创的JsonDb数据包&#xff0c;无需复杂的安装解压过程即可使用。目前系…

Cache学习(1):常见的程序运行模型多级Cache存储结构

0 背景&#xff1a;常见的程序运行模型&#xff08;为什么要Cache&#xff09; 主存&#xff1a;Main Memory&#xff0c;硬件实现为RAM&#xff0c;产品形态&#xff1a;DDR&#xff08;例如&#xff1a; DDR3、DDR4等&#xff09;磁盘设备&#xff1a;Flash Memory&#xff…

计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Flutter笔记:拖拽手势

Flutter笔记 拖拽手势 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134485123 目 录 1. 概述2. 垂直拖…

设计模式-访问者模式-笔记

Visitor模式 动机&#xff08;Morivation&#xff09; 在软件构建过程中&#xff0c;由于需求的变化&#xff0c;某些类层次结构中常常需要增加新的行为&#xff08;方法&#xff09;&#xff0c;如果直接在基类中做这样的更改&#xff0c;将会给子类带来很繁重的变更负担&am…

【算法】二分查找-20231122

这里写目录标题 一、1089. 复写零二、917. 仅仅反转字母三、88. 合并两个有序数组四、283. 移动零 一、1089. 复写零 提示 简单 266 相关企业 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&a…