目录
目录
前言
感觉复习有点慢了,今天主要复习图的基本概念,然后看一下图的存储结构以及基本操作,明天一口气复习到遍历。
明天下午有事,还有去准备答辩,争取三天左右看完图相关内容吧。
一、图的定义
图就是点与边的集合。准确的来说,图 G 由顶点集 V 和边集 E 组成,记为 G = (V,E),其中 V(G) 表示图 G 中顶点的有限非空集;E(G) 表示图 G 中顶点之间的关系(边)集合。
V = {v1, v2, ... , vn},则用 |V| 表示图 G 中顶点的个数,也称为图 G 的阶,E = {(u, v) | u ∈ V, v ∈ V},用 |E| 表示图 G 中边的条数
注:顶点集V是非空的
如图,图1、2都属于“图”,但是图3中缺少一个顶点,有边与之相连,因此图3不属于“图”。
1 无向图
当E是无向边(简称边)组成的集合时,图G(V, E)就是无向图。
顶点A, B之间是无序关系,因此其关系体现——边可以记作(A, B)或(B, A),因为(A, B)=(B, A)
可以说A, B互为邻接点;边(A, B)依附于顶点A, B;边(A, B)与顶点A, B相关联。
该无向图中,G=(V, E),V={A, B, C, D, E},E={(A, B), (A, C), (A, D), (A, E), (B, E), (C, D)}
2 有向图
若E是有向边(也称弧)的有限集合时,则图G为有向图。
顶点A, B之间是有序关系,其关系体现——弧可以记为<A, B>,其中A是弧尾,B是弧头。
<A, B>是顶点A到B的弧,也可以说A邻接到B,B邻接自A。<A, B>≠<B, A>
该有向图中,G=(V, E),V={A, B, C, D, E},E={<A, D>, <D, A>, <A, C>, <A, E>, <E, B>}
3 简单图
满足:1、不存在重复边;2、不存在顶点到自身的边
这两个条件的图就是简单图。
如图,左下图中有一条<A, A>弧,不满足条件1;两条<A, D>弧,不满足条件2。右下图中有一条(A, A)边,不满足条件1;两条(A, E)边,不满足条件2。因此这两张图都不是简单图。
4 多重图
多重图与简单图向对应,就是某两顶点之间有超过一条边/弧,或者顶点自身通过一条边/弧与自身相连。
如图,这就是典型的多重图。
二、图的基本概念
1 顶点的度
对于无向图来说,顶点v的度就是依赖于该顶点的边的条数,记为TD(v)
对于有向图来说,入度是以顶点 v 为终点的有向边的数目,即射入顶点的弧的数目,记为 ID(v);出度是以顶点 v 为起点的有向边的数目,即射出顶点的弧的数量,记为 OD(v);顶点 v 的度等于其入度和出度之和,即 TD(v) = ID(v) + OD(v)
在有 n 个顶点、e 条边的无向图中,sum(TD) = 2e
在有 n 个顶点、e 条边的有向图中,sum(ID) = sum(OD) = e
2 路径
1、路径:如果顶点Vi和Vj之间有通路(可达),则Vi到Vj之间的所有顶点序列称为Vi到Vj的路径。
2、回路:第一个顶点和最后一个顶点相同的路径被称为回路或环
3、简单路径:顶点序列中未出现重复顶点的路径。
4、简单回路:除了第一个顶点和最后一个顶点相同外,顶点序列中未出现重复顶点的回路。
5、路径长度:路径上边/弧的数目。
6、点到点的距离:从顶点 u 出发到顶点 v 的最短路径若存在,则此路径的长度称为从 u 到 v 的距离。若从 u 到 v 根本不存在路径,则记该距离为无穷
7、在无向图中,若从顶点 u 到顶点 v 有路径存在,则称 u 和 v 是连通的
8、在有向图中,若从顶点 u 到顶点 v 和从顶点 v 到顶点 u 之间都有路径,则称这两个顶点是强连通的
9、若无向图 G 中任意两个顶点都是连通的,则称图 G 为连通图,否则称为非连通图
10、若有向图 G 中任意两个顶点都是强连通的,则称图 G 为强连通图(有向图不讲连通图,只有强连通图)
11、将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。
常见考点:
对于有 n 个顶点的无向图 G:
1、若G是连通图,最多有 n(n-1)/2 条边,最少 n-1 条边。
2、若G是非连通图,最多有 (n-1)(n-2)/2 条边,最少 0 条边。
对于有 n 个顶点的有向图 G:
1、若G是强连通图,最多 n(n-1) 条边,最少 n 条边
2、若G是弱连通图,最多 n(n-1) 条边,最少 n-1 条边
3 子图
1、子图:图 G 的顶点集 V 的子集与边集 E 的子集构成的图(并非任意挑几个点、几条边就能构成子图)
如图所示,左侧是子图,右侧无法构成图,因此不是子图。
2、生成子图:包含了原图中所有顶点的子图
3、连通分量:无向图中的极大连通子图
4、强连通分量:有向图中的极大强连通子图
5、连通图的生成树是包含图中全部顶点的一个极小连通子图。添加一条边就会形成回路,去掉一条边就会变成非连通图。
如图,生成树不止一个。
6、非连通图中,连通分量的生成树构成了非连通图的生成森林
4 权
1、边的权:在一个图中,每条边都可以标上具有某种含义的数值,该数值称为该边的权值
2、带权图/网:边上带有权值的图称为带权图,也称网
3、当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度
5 几种特殊形态的图
1、无向完全图:无向图中任意两个顶点之间都存在边
2、有向完全图:有向图中任意两个顶点之间都存在方向相反的两条弧
3、稀疏图:边数很少的图
4、稠密图:与稀疏图相对
一般当 |E| < |V|log|V| 时,就可以认为G是稀疏图
5、树:不存在回路、且连通的无向图。n 个顶点的树,其必有 n-1条边
常见考点:|E| > n-1,则图G中一定有回路
6、森林:各个子图都是极小的、都是连通的
7、有向树:一个顶点的入度为 0,其余顶点的入度均为 1 的有向图。不是强连通图
三、图的存储
1 邻接矩阵法(顺序存储)
顾名思义,使用矩阵的方法进行存储。
#define MaxVertexNum 20 //顶点最大数目
typedef struct {
char Vertex[MaxVertexNum]; //顶点集
int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵
int VexNum, EdgNum; //当前图中顶点数、边/弧数
} MatrixGraph;
通过此种方法存储矩阵,空间复杂度仅与顶点数相关,空间复杂度高。适合用于存储稠密图
但是由于无向图的矩阵是对称矩阵,因此可以压缩存储。
2 邻接表法(顺序+链式)
与树的孩子表示法方法如出一辙,见示意图
#define MaxVertexNum 20 //设置图中最大顶点数
typedef struct LinkNode { //定义边/弧
int adjvex; //边的另一端在何处
struct LinkNode* next; //下一个边指针
} EdgNode;
typedef struct { //定义顶点
ElemType data; //顶点数据
struct LinkNode* first; //指向第一条边的指针
} VexNode;
typedef struct { //定义图
VexNode nodes[MaxSize]; //顶点集
int VexNum, EdgNum; //图当前顶点总数与边/弧总数
} Graph;
3 十字链表法(只能存储有向图)
4 邻接多重表(只能存储无向图)
以上两种存储方式区别在于顶点的结构,边的结构区别不大
理解倒是很好理解,但是复述有点麻烦,所以就放个图了,看图理解
后记
马上就要准备毕设答辩了,最近周围还出现了复阳的。
后续应该会再花2天时间复习图,然后就是花3~4天时间复习查找,3~4天复习排序。
然后就开始复习计网。