图的概念(离散数学中学过)
图的定义和种类
定义
图是由顶点集V和弧集R构成的数据结构。
![](https://i-blog.csdnimg.cn/blog_migrate/5fbedda701fa13e2cf1fe4d869242d87.png)
分类
(1)无向图
若图中所有边都是不带方向的,则称该图是无向图。
(2)有向图
若图中所有边都是有向的,则称该图是有向图。
(3)权、网或网络
有些图中,边附带着一个称为权值的数据,这样的边称为加权边。若无向图(或有向图)的每条边(或弧)都带权,这样的图称为无向网(或有向网)。
相关术语
1. 顶点的度顶点的度 (degree) 是指依附于某顶点 v 的边数,通常记为 TD(v) 。在有向图中,要区别顶点的入度与出度的概念。顶点 v 的入度是指以顶点 v 为终点的弧的数目,记为 ID(v);顶
点 v 的出度是指以顶点 v 为始点的弧的数目,记为 OD(v) 。有 TD(v) = ID(v) + OD(v) 。2. 路径和回路无向图 G = (V , E) 中从顶点 v 到顶点 v' 之间的路径 (path) 是一个顶点序列 (v = v i1 ,v i2 ,…,vim = v') ,其中, (v ij , v ij+1 ) ∈ E , 1 ≤ j < m。路径上边或弧的数目称为路径长度。序列中顶点 不重复出现的路径称为简单路径。路径中第一个顶点和最后一个顶点相同时称该路径为回路或者环(cycle)。除第一个顶点与最后一个顶点之外,其他顶点不重复出现的回路称为简单回路,或者简单环。3. 子图对于图 G = (V , E) , G' = (V' , E') ,若存在 V' 是 V 的子集, E' 是 E 的子集,则称图 G'是 G 的一个子图。4. 无向图的连通性在无向图中,如果从一个顶点 v i 到另一个顶点 v j (i ≠ j) 有路径,则称顶点 v i 和 v j 是连通的。如果图中任意两顶点都是连通的,则称该图是连通图。如图 7.1 中 G 1 就是一个连通图。无向图的极大连通子图称为连通分量。注意连通分量的概念,强调: 是子图; 子图要连通; 含有极大顶点数及依附于这些顶点的所有的边。5. 有向图的连通性对于有向图来说,若图中任意一对顶点 v i 和 v j (i ≠ j) 均有从一个顶点 v i 到另一个顶点 v j的路径,也有从 v j 到 v i 的路径,则称该有向图是强连通图。有向图的极大强连通子图称为强连通分量。6. 生成树和生成森林一个连通图的生成树是一个极小的连通子图,它包含有图中全部的顶点 n ,但只有足以构成一棵树的 n - 1 条边。任一无向连通图最少存在一棵生成树。
一个有 n 个顶点的无向图最多有 ___ 条边。n(n-1)/2
n 个顶点的连通图用邻接矩阵表示时,该矩阵至少有( ______ )个非零元 素。2(n-1)
图的存储结构
考虑到图的信息包括两部分:顶点的信息、顶点之间的关系
邻接矩阵
#define INFINITY <整数中允许的最大值>
#define MAXNODE <图中顶点的最大个数>
typedef char VertexType; /*假设顶点数据为字符型*/
typedef struct
{
int adj; /*图:若两顶点相邻则 adj=1,否则 adj=0;*/
/*网:若两顶点相邻则 adj=wij,若 i=j 则 adj=0;否则 adj=∞ */
} ArcType;
typedef struct
{
VertexType vertexs[MAXNODE];
ArcType arcs[MAXNODE][MAXNODE]; /*邻接矩阵*/
int vexnum, arcnum; /*图的顶点数和弧数*/
} GraphType;
邻接表
#define MAXNODE <图中顶点的最大个数>
typedef struct arc
{
int adjvex; /*邻接点域,存储邻接点在表头结点表中的位置*/
int weight; /*权值域,用于存储边或弧相关的信息,非网图可以不需要*/
struct arc *next; /*链域,指向下一邻接点*/
} ArcType; /*边表结点*/
typedef struct
{
ElemType data; /*顶点信息*/
ArcType *firstarc; /*指向第一条依附该顶点的边或弧的指针*/
} VertexType; /*顶点表结点*/
typedef struct
{
VertexType vertexs[MAXNODE];
int vexnum, arcnum; /*图中顶点数和弧数*/
} AdjList;
图的基本操作
图的遍历
深度优先遍历:一条路走到黑(每次找一个)
广度优先遍历:结交所有朋友(找所有)
图的应用
图的连通性问题
有向无环图及其应用-拓扑排序和关键路径
判定一个有向图是否存在回路除了可以利用拓扑排序方法外 , 还可以利用 _____________ 。深度优先遍历算法
拓扑排序
在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:
(1)每个顶点出现且只出现一次。
(2)若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。
它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:
从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。
从图中删除该顶点和所有以它为起点的有向边。
重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。
最短路径
AOE网络关键路径
完成整个工程所需的时间 取决于从源点到终点的 最长 路径长度, 这条路径 叫做 关键路径(Critical Path)。 关键路径上的点称为 关键活动 。找到关键找出 关键活动,将其按序连接起来,就可以得到 关键路径
最小生成树
prim算法
- 在一个加权连通图中,顶点集合
V
,边集合为E
- 任意选出一个点作为初始顶点,标记为
book
,计算所有与之相连接的点的距离,选择距离最短的,标记book
. - 重复以下操作,直到所有点都被标记为
book
:
在剩下的点钟,计算与已标记book
点距离最小的点,标记book
,证明加入了最小生成树。
Kruskal算法
首先,将每个顶点放入其自身的数据集合中。然后,按照权值的升序来选择边。当选择每条边时,判断定义边的顶点是否在不同的数据集中。如果是,将此边插入最小生成树的集合中,同时,将集合中包含每个顶点的联合体取出,如果不是,就移动到下一条边。重复这个过程直到所有的边都探查过。