【数据结构笔记】图Graph

news2024/11/29 3:59:51

目录

物理结构

邻接矩阵

矩阵压缩

关联矩阵

邻接表

邻接多重表

图搜索

广度优先搜索BFS

边分类

连通域分解

无权最短路径

深度优先搜索DFS

边分类

 双连通分量

优先级优先搜索PFS

单源最短路径问题

Dijkstra算法

Bellman-Ford算法

所有结点对最短路径问题

Floyd-Warshall算法

拓扑排序

并查集

最小生成树

Prim算法

Kruskal算法


G=(V,E),|V|=n,|E|=e

有向无环图DAG:Directed Acyclic Graph

Euler环路:经过图中各边一次且恰好一次的环路

Hamilton环路:经过图中各顶点一次且恰好一次的环路

Euler公式:n-e+f-c=1,其中n、e、f和c分别为平面图的顶点、边、面和连通域的数目

物理结构

邻接矩阵

一个n阶方阵A,E中有一条边(u,v)当且仅当A[u][v]=1

O(n^2)空间

矩阵压缩

(联系数值代数中的相关压缩技巧)

关联矩阵

一个n×e阶矩阵B,E中有一条边i从顶点u出发当且仅当B[u][i]=-1,E中有一条边j从顶点v进入当且仅当B[v][j]=1

  • 对于稠密图,邻接矩阵优
  • 对于稀疏图,关联矩阵优

(《算法导论》练习22.1-7)

对于无向图,BB^T的非对角元与A相同,对角元是对应顶点的度数

对于有向图,BB^T表明两个顶点间有多少条有向边

O(ne)空间

邻接表

每个顶点引出一个List,存放从自身出发的各边及权

O(n+e)空间

邻接矩阵邻接表
适用场合经常检测边的存在
经常做边的插入/删除
图的规模固定
稠密图
经常计算顶点的度数
顶点数目不确定
经常做遍历
稀疏图

邻接多重表

图搜索

顶点的活跃期:[dTime,fTime]

  • dTime:discovered time,顶点被发现的时刻
  • fTime:finished time,顶点完成访问的时刻

前沿集:在所有已访问到的顶点中,仍有邻居尚未访问者

广度优先搜索BFS

template<typename Tv, typename Te> void Graph<Tv, Te>::BFS(Rank v, Rank& dClock) {
    Queue<Rank> Q; 
    status(v) = DISCOVERED;
    Q.enqueue(v);
    dTime(v) = dClock++; //起点
    for (Rank fClock = 0; !Q.empty(); ) { //在Q变空之前,反复地
        if (dTime(v) < dTime(Q.front())) //dTime的增加,意味着开启新的一代,因此
        dClock++; //dTime递增
        fClock = 0; //fTime复位
        v = Q.dequeue(); //取出队首顶点v,并
        for (Rank u = firstNbr(v); -1 != u; u = nextNbr(v, u)) { //考查v的每一个邻居u
            if (UNDISCOVERED == status(u)) { //若u尚未被发现,则发现之
                status(u) = DISCOVERED; //发现该顶点
                Q.enqueue(u);
                dTime(u) = dClock;
                type(v, u) = TREE;
                parent(u) = v; //引入树边,拓展BFS树
            } else //若u已被发现(正在队列中),或者甚至已访问完毕(已出队列),则
                type(v, u) = CROSS; //将(v, u)归类于跨边
            }
            status(v) = VISITED;
            fTime(v) = fClock++; //至此,v访问完毕
        }
    }
}

辅助队列Q

  • 从左到右到起点s的距离单调非降
  • 首末顶点到起点s的距离至多差1
  • 相邻顶点到起点s的距离至多差1

​​​​​​​​

边分类

树边端点到起点s的距离差1

横向边端点到起点s的距离至多差1

空间复杂度O(n+e)

  • 队列长度O(n)
  • 边和顶点的状态O(n)+O(e)

时间复杂度O(n+e)

连通域分解

无权最短路径

【2014-THU-Fin】在无向连通图G中选定一个顶点 s,并将各顶点v到s的距离记作dist(v)(特别地,dist(s)=0)。于是在G.BFS(s)过程中,若辅助队列为Q,则dist(Q.front())+1≥dist(Q.rear())始终成立。(√)

深度优先搜索DFS

template<typename Tv, typename Te> void Graph<Tv, Te>::DFS(Rank v, Rank& clock) {
    dTime(v) = ++clock;
    status(v) = DISCOVERED; //发现当前顶点v
    for (Rank u = firstNbr(v); -1 != u; u = nextNbr(v, u)) {//考察v的每一邻居u
        switch (status(u)) { //并视其状态分别处理
            case UNDISCOVERED: { //u尚未发现,意味着支撑树可在此拓展
                type(v, u) = TREE;
                parent(u) = v;
                DFS(u, clock);
                break;
            } case DISCOVERED: { //u已被发现但尚未访问完毕,应属被后代指向的祖先
                type(v, u) = BACKWARD;
                break;
            } default: { //u已访问完毕(VISITED,有向图),则视承袭关系分为前向边或跨边
                type(v, u) = dTime(v) < dTime(u) ? FORWARD : CROSS;
                break;
            }
        }
    }
    status(v) = VISITED;
    fTime(v) = ++clock; //至此,当前顶点v方告访问完毕
}

对应迭代改写

辅助栈S

深度不小于DFS树的最大深度,即O(n)

边分类

  • 树边(u,v):status(v) = UNDISCOVERED
  • 后向边(u,v):status(v) = DISCOVERED
    • 后向边数<=图中回路数
      • 一条后向边可能划分出多条回路
      • 多条回路可能共用一条后向边
      • 有后向边yi'di
  • 前向边(u,v):status(v) = VISITED,dTime(u) < dTime(v)
    • 在当前DFS树中u是v的祖先
  • 横向边(u,v):status(v) = VISITED,dTime(u) > dTime(v)
    • u在v所在分支被访问完后到达,表明边已经跨分支,不在DFS树中

空间复杂度O(n+e)

  • 队列长度O(n)
  • 边和顶点的状态O(n)+O(e)

时间复杂度O(n+e)

(《算法导论》练习22.3-8)

(《算法导论》练习22.3-9)

 双连通分量

(《算法导论》练习22-2)

【2010-THU-Fin】某有向图的邻接矩阵如下,现从顶点1出发做DFS遍历,遇多顶点歧义时编号小者优先。试在表标出各边的分类结果(树边T,前向边F,后向边B,跨边C)

1234
1
2
3
4

 【2014-THU-Fin】我们知道,因同一顶点的邻居被枚举的次序不同,同一有向图 G 所对应的 DFS 森林未必唯一。然而只要起始于 G 中某顶点 s 的某次 DFS 所生成的是一棵树,则起始于 s 的任何一次 DFS 都将生成一棵树。()

【2014-THU-Fin】有向图的DFS不仅起点任意,而且每一步迭代往往都会有多个顶点可供选择,故所生成的DFS森林并不唯一确定,且其中所含()的数量也可能不同。
A. 树边
B. 前向边
C. 后向边
D. 跨越边
E. 以上皆非

【2016-THU-Fin】如果把朋友圈视为一无向图,那么即使A君看不到你给B点的赞,你们仍可能属于同一个双联通分量。(√)

【2014,2016-THU-Fin】在有向图G中,存在一条自顶点v通向u的路径,且在某次DFS中有dTime[v]<dTime[u],则在这次DFS所生成的DFS森林中,v必是u的祖先。(×)

优先级优先搜索PFS

【2016-THU-Fin】在图的优先级搜索过程中,每次可能调用多次prioUpdater,但累计调用次数仍为O(e)。()

单源最短路径问题

给定根节点的PFS树(SPT,Shortest Path Tree)

  • 根节点到其他节点的单源最短路径

必须无负权回路

Dijkstra算法

无负权边的单源最短路径问题

基于命题:最优路径的前缀一定也是最优前缀

  • 若存在负权边,随着边的加入,路径长度不一定是单调递增的,局部最优不能保证全局最优
  1. 选定起点s,记为T1
  2. 对于任意Tk,在所有与Tk邻接的顶点中选择优先级最高的顶点加入顶点集,对应边加入边集,记为Tk+1
    1. 优先级=顶点到树顶点的最小距离+s到接应顶点的最小距离
    2. 只有邻接顶点被加入了顶点集,自身优先级才会更新
  3. Tn即为PFS树

(《算法导论》练习24.3-2)

Bellman-Ford算法

PFS唯一性问题

所有结点对最短路径问题

Floyd-Warshall算法

拓扑排序

  • DAG:有极大元的偏序集

    • Zorn引理:若偏序集S的任何链都有上界,则S有极大元

  • 拓扑排序:全序集

顺序输出零入度顶点

逆序输出零出度顶点

并查集

最小生成树

(《数据结构与算法分析 Java语言描述》练习9.17)

Cayley公式

  • Prim算法:顶点视角,扩张最小生成树的顶点
  • Kruskal算法:边视角,扩张最小生成树的边

(《算法导论》练习23.1-1)

(《算法导论》练习23.1-4)

因轻量级边仅是横跨切割的所有边中的极小边而非最小

(《算法导论》练习23.1-6)

Prim算法

Kruskal算法

最小生成树唯一性问题

  • 由Kruskal算法正确性,如果各边权值互异,那么最小生成树是唯一的
  • 由《算法导论》练习23.1-6,如果Prim算法执行中没有选择,那么最小生成树是唯一的
  • 如果各边权值不互异,那么最小生成树可能不唯一
    • 两个算法执行出的结果也不唯一
  • Prim算法适合稀疏图
  • Kruskal算法适合稠密图

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

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

相关文章

Python语言核心12个必知语法细节

1. 变量和数据类型 Python是动态类型的&#xff0c;变量不需要声明类型。 python复制代码 a 10 # 整数 b 3.14 # 浮点数 c "Hello" # 字符串 d [1, 2, 3] # 列表 2. 条件语句 使用if, elif, else进行条件判断。 python复制代码 x 10 if x > 5: print(&q…

获取首日涨停封盘后第二次交易日上涨/下跌的概率

有许多投资者喜欢在股票涨停封盘后&#xff0c;跟进买入。普通股民会认为一个能在今日涨停封盘的股票&#xff0c;证明其上市公司正有十分重大的利好信息&#xff0c;只需要跟进购买便可以获取短期利益。 我们用数据来看一下在当日涨停封盘后&#xff0c;第二次交易日是上涨还…

JavaWeb——Vue:打包部署(Nginx、目录介绍、部署及启动、访问 )

目录 打包 部署 Nginx 目录介绍 部署及启动 访问 前端 Vue 项目的最后一步是打包部署。在当前前后端分离的开发模式中&#xff0c;前端开发人员开发前端代码&#xff0c;后端开发人员开发后端代码。最终要将开发及测试完毕的前端 Vue 代码和后端代码分开部署在对应的服…

pulsar mq 单体验证demo, docker启动pulsar mq验证生产者消费者命令

1. 进入pulsar # 进入容器 docker exec -it xxx /bin/bash # 进入脚本 cd bin 2. 消费命令&#xff1a; ./pulsar-client consume my-topic -s "fist-subscription" 3. 新增一个创建&#xff0c;重复上述操作&#xff0c;进入bin文件夹&#xff0c;输入生产者命令…

JavaSE——集合9:Map接口实现类—HashTable

目录 一、HashTable基本介绍 二、HashTable底层源码解析 1.初始化数组长度为11&#xff0c;临界值为8(0.75*11)&#xff0c;加载因子是0.75 2.对存放的值进行自动装箱 3.执行put方法 4.计算key的hash值 5.计算索引值&#xff0c;放入table数组中 6.插入重复的key会被替…

VMware安装Ubuntu虚拟系统

1、准备工作 1&#xff09;下载并安装好VMware虚拟软件&#xff1b; 2&#xff09;下载Ubuntu系统镜像文件。建议下载LTS长期支持版本&#xff0c;下载地址&#xff1a; Ubuntu系统下载 | Ubuntu 2、安装Ubuntux系统 2.1、新建虚拟机 打开VMware软件&#xff0c;在右侧“…

住房公积金 计算器-java方法

计算了一下房贷压力&#xff0c;以全额公积金贷款为例&#xff0c;贷款四十万&#xff0c;等额本金方式还款&#xff0c;房贷利率为2.85%&#xff0c;基本情况就是如下&#xff1a; 还款总额达到 提前还款的好处 按三十年计算&#xff0c;如果第一年借用亲朋好友的钱&#x…

无mac通过iOS Dev Center生成打包证书完整流程

很多人第一次使用uniapp打包ios APP应用的时候&#xff0c;都会遇到一个问题&#xff0c;就是如何生成打包证书。 看了uniapp官网的教程&#xff0c;教程上看到是在iOS Dev Center上创建证书&#xff0c;但是过程中却要求我们使用macOS系统来创建csr文件和p12文件。但是我们没…

【ChatGLM4系列】入门介绍以及API调用

目录 前言一、ChatGLM41-1、模型介绍1-2、关键概念1-3、场景示例1-4、模型概览 二、快速开始2-1、安装2-2、Demo案例2-3、请求参数2-4、异步调用 三、模型工具3-1、通用Web搜索3-2、函数调用3-3、增强检索3-4、文件问答 总结 前言 GLM 全名 General Language Model &#xff0c…

数据可视化-使用python制作词云图(附代码)

想象一下&#xff0c;当你写完一篇日记或者一篇文章后&#xff0c;想要知道里面哪些词语出现得最多。这时候&#xff0c;词云图就能派上用场了。它会统计出文章里每个词语出现的次数&#xff0c;然后把这些词语以不同大小的字体展示出来&#xff0c;出现次数越多的词语&#xf…

免费打工人必备工具箱

下载地址&#xff1a;https://pan.quark.cn/s/356d7f201d7a 图片处理工具 格式转换&#xff1a;轻松转换图片格式&#xff0c;满足不同需求。 ICO转换&#xff1a;将图片转换为ICO格式&#xff0c;适用于图标设计。 图片压缩&#xff1a;无损压缩图片&#xff0c;减小文件大小…

Oracle中解决select into值集为空的报错情况

先看为空的情况 procedure test is n number; begin select 1 into n from CUX_2_OM_RELEASE_LIMIT_V cov where cov.Customer_Idnull; end; CUX_2_OM_RELEASE_LIMIT_V中没有id是空的&#xff0c;因此返回的结果一定是空集 运行结果: 有时候我…

Excel使用技巧:筛选2组数据;条件格式突出显示数据

Excel的正确用法&#xff1a; Excel是个数据库&#xff0c;不要随意合并单元格。 数据输入的时候一定要按照行列输入&#xff0c;中间不要留空&#xff0c;不然就没有关联。 筛选2组数据 相信大家已经知道如何筛选1组数据&#xff0c;有时候我们需要同时筛选2组数据。有2步&…

探秘盒子浮动,破解高度塌陷与文字环绕难题,清除浮动成关键!

目录 一、浮动 1、为什么使用浮动&#xff1f; 2、浮动的概念 3、语法 4、浮动的特性 &#xff08;3&#xff09;浮动的元素会具有行内块元素的特性 5、浮动元素经常和标准流父级搭配使用 6、浮层的弊端 &#xff08;1&#xff09;高度塌陷 &#xff08;2&#xff09;…

无人机之声学识别技术篇

一、声学识别技术的原理 无人机在飞行过程中&#xff0c;其电机工作、旋翼震动以及气流扰动等都会产生一定程度的噪声。这些噪声具有独特的声学特征&#xff0c;如频率范围、时域和频域特性等&#xff0c;可以用于无人机的检测与识别。声学识别技术主要通过以下步骤实现&#x…

浙大数据结构:11-散列2 Hashing

这道题主要是小细节要把握&#xff0c;实际难度不大 机翻 1、条件准备 表大小&#xff0c;输入数据数 #include <iostream> #include<vector> #include<cmath> using namespace std; #define endl \nint Size,n;2、主函数 先输入数据&#xff0c;用ispr…

目前web浏览器播放rtsp视频流,h5播放rtmp监控方案比较,代码测试

在web上实现播放rtsp/rtmp视频流&#xff0c;由于浏览器不 能自定义协议&#xff0c;不能直接播放&#xff0c;市面上充满各种方案&#xff0c;鱼龙混杂&#xff0c;主要方案有两种&#xff1a; 1&#xff0c;浏览器插件方案&#xff0c;vlc浏览器控件&#xff08;已过期&…

远翔原厂芯片设计开发软件:降压恒流共阳极无频闪调光芯片FP7126/7127/7128,舞台灯磁吸轨道灯智能家居应用方案

FP7126 FP7127 FP7128是平均电流模式控制的 LED 驱动 IC&#xff0c;具有稳定输出恒流的能力&#xff0c;优秀的负载调整率与高精度的电流控制。不用额外增加外部补偿元件&#xff0c;简化 PCB 板设计。FP7126 FP7127 FP7128可接受 PWM 数位调光&#xff0c;建议调光频率 0.1kH…

事务使用方法

为什么需要事务&#xff1a; 示例&#xff1a; 银行转账问题 假定资金从账户A转到账户B&#xff0c;至少需要两步 账户A的资金减少 然后账户B的资金相应增加。 示例 假定张三的账户有1000元&#xff0c;李四账户有1元 UPDATE bank set moneymoney-500 WHERE name张三; UPDA…

以价换量,豆包血拼AI的商业考量

“ 借豆包AI推出智能耳机&#xff0c;字节跳动再战智能硬件&#xff0c;仍面临研发、营销成本高企和商业模式不明确的挑战&#xff0c;这一新尝试充满变数。 ” 转载&#xff1a; 科技新知 原创 作者丨颜瞾 编辑丨蕨影 没有哪个赛道&…