图论1基础内容

1. 图的定义和术语

1.1 生活中的图

1.2 图的定义和术语

图由点和边连接组成,一些复杂的图中点和边会有相应的权值

1.2.1符号定义:G = (V,E)

节点集合V,其中的元素称为节点或者顶点

边集合E,其中的元素称为边

1.2.2 有向图和无向图

有向图中,一个点到另一个点的边指向性是单一的,例如A->B表示A有一条可以通向B的路,但不代表B也有一条可以通向A的路;无向图则表示AB互通

1.3 完全图、稀疏图和稠密图
1.3.1完全图:

有向完全图:任意两个顶点都有方向相反的有向边

无向完全图:任意两点都有边相连

1.3.2 稀疏图:

假设一幅图有n个节点m条边,当 m<nlog2n,即边的数量远小于节点的数量的图

1.3.3 稠密图:

假设一幅图有n个节点m条边,当 m>nlog2n,即边的数量远大于节点的数量的图

1.4 子图

对于一幅图G = (V,E),若有另一幅图G' = (V',E'),当V包含V'、E包含E'时,G'是G的子图,可以用集合来理解G={1,2,3,4},G'={3,4}

1.5 邻接点

在图(有向图、无向图)中,若节点a和节点b是边e的两个端点,则a和b是邻接的,边e关联与点a和点b

1.6 度、入度和出度
1.6.1 对于无向图,只有度的概念

在无向图中,一个节点的度是指与该节点直接相连的边的数量。这个度量反映了节点的连接强度。

1.6.2 对于有向图则有入度和出度的概念

入度:在有向图中,一个节点的入度是指从其他节点指向该节点的边的数量。这反映了有多少其他节点指向该节点。

出度:相应地,一个节点的出度是指从该节点指向其他节点的边的数量。这反映了该节点对其他节点的控制或影响程度。

图中,OD代表出度、ID代表入度

1.7 权值与网

图中两个节点之间的边带上一个有意义的数,称为边的权值,即边权

1.8 路径与回路

图中V1V4的长度是8;V1V4V3V2V5的长度是两相邻的点之间边权的顺序和8+2+3+5=18

V0V1V2V3V4是一条简单路径

V0V1V5是一条简单回路

1.9 连通图

G1是无向图,容易两点均有边连接,即可到达,是连通图

G2中有三个独立的连通块,极大连通子图并不是最大连通子图,G2中有3个连通分量

1.10 生成树

生成树指的是连通图中的极小连通子图

每两个点之间都存在一条可达到路径,如果有边权则生成树是原图边权之和最小的子图

2. 图的储存结构

2.1 数组表示法(邻接矩阵)

2.1.1不带权简单图的邻接矩阵

2.1.2带权简单图的邻接矩阵

2.2 邻接表
2.2.1不带权邻接表
2.2.2带权邻接表

3. 图的遍历

对于图的遍历,要求是把一个图中的所有节点不重复、不遗漏地访问一次

不重复:图中可能存在环路,访问过的顶点避免重复访问

不遗漏:

按照一定次序进行访问,比如接下来提到的两种方法,深度优先搜索DFS、广度优先搜索BFS

保证不连通图的各个顶点均被访问到(遍历的过程存在回退的情况)

3.1 深度优先搜索DFS

DFS是基于栈的数据结构去实现,尽可能一条路走到底,如果还没完成全图的遍历再回退,然后选择可行路径继续走。

对于这个图,要求使用DFS,从V1出发,优先访问序号小的顶点,访问完全图

遍历过程:V1 V2 V4 V5 V6 V3 V7 V8(V9还没有访问,进行回退。回退到V7 V3 V6 V5此时V5与V9连通) V9

3.2 广度优先搜索 BFS

BFS是基于队列的数据结构实现,在python中通常使用优先队列,遍历时,先把起点加入队列,然后找寻与当前点连通的点中距离最近的继续加入队列,直到跑完全图。

遍历的策略

4. 图的应用

4.1 拓扑排序

拓扑排序针对有向无环图的顶点进行线性排列的算法,使得对于任何来自顶点A指向顶点B的边,A都在序列中出现在B之前。这样的排序存在于有向无环图中,而对于非有向无环图则不存在拓扑排序。

拓扑排序也可以用来检测图中有无成环

4.2 最小生成树

生成树是连通图的极小连通子图,多一条边就会成环,少一条边即无法构成连通图

生成树的代价:

G=(V,E)是一个无向连通图,代价是生成树上各边的边权和

生成树代价=9+49+11+1+21=91

最小生成树即是代价最小的生成树

上图中代价min=1+7+10+7+5=30

4.3 最短路问题

最短路径是两个顶点之间经历的边上边权之和最小的可达路径

4.3.1 Floyed

用于处理多源最短路,从多个点出发到一个点的最短路,可以存在负权边。

4.3.2 Dijkstra

用于处理单源最短路,从一个点出发到一个点的最短路,不可以存在负权边。

相关推荐
顾一大人5 分钟前
dp自动化登陆之hCaptcha 验证码
爬虫·python·自动化
邝邝邝邝丹9 分钟前
React学习———React.memo、useMemo和useCallback
javascript·学习·react.js
小羊在奋斗16 分钟前
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
算法·leetcode·链表
一年春又来25 分钟前
AI-02a5a6.神经网络-与学习相关的技巧-批量归一化
人工智能·神经网络·学习
爱上彩虹c26 分钟前
LeetCode Hot100 (1/100)
算法·leetcode·职场和发展
小陈的进阶之路33 分钟前
计算机大类专业数据结构下半期实验练习题
数据结构·算法·深度优先
瑞雪兆丰年兮34 分钟前
数学实验(Matlab符号运算)
开发语言·算法·matlab·数学实验
不会计算机的捞地42 分钟前
【数据结构入门训练DAY-30】数的划分
数据结构·算法·深度优先
s1ckrain1 小时前
嵌入式操作系统学习笔记
学习·嵌入式·ucosii
Code_流苏1 小时前
《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
python·深度学习·ner·预训练语言模型·关系抽取·统计机器学习·标注方式