图
Graph
定义
图是由顶点集合(Vertex)及顶点间的关系集合E组成的一种数据结构
记为
通用名词
-
顶点
:图的最小单元权
:边上的一个有意义的数值网
:带权的图边
:两顶点间的关系,无向图中记作弧
:有向图的边,记作,x为弧尾,y为弧头
-
子图
:设和,若且,则称为的子图邻接点
:有边,则互为邻接点,也称相邻接;边依附于,也称边与相关联度
:和该顶点相关的边的数量入度
:以该顶点为弧头的弧的数量出度
:以该顶点为弧尾的弧的数量
路径
:一个顶点到另一个顶点之间的通路(箭头方向要相同)路径长度
:一条路径中边的数量简单路径
:顶点不重复出现的路径
回路(环)
:第一个顶点和最后一个顶点相同的路径简单回路(简单环)
:除了第一个顶点和最后一个顶点,路径中的其余点不重复出现的路径
-
有向图,无向图
:有向图单向箭头,无向图双向箭头完全图
:任意两顶点间都有边的图连通图
:任意两顶点间都有路径的图连通
:两顶点间有路径,称该两顶点连通连通分量
:不是连通图的无向图中符合连通图的性质的子图强连通图
:任意两顶点间都有来回路径的有向图强连通分量
:不是强连通图的有向图中符合强连通图的性质的子图
-
有向树
:满足下列条件的有向图- 有且仅有一个结点入度为0
- 除根外的结点入度为1
- 从根到任一节点只有一条有向通路
生成树
:对连通图进行遍历,过程中所经过的边和顶点的组合构成的树生成森林
:非连通图的生成树的集合
稀疏图,稠密图
:一个比较模糊的概念,稀疏图大概是的图,就是边远少于点的图,反之就是稠密图
最小生成树
最小生成树可能不唯一
定义
在遍历连通网时,总权值最小的生成树
求最小生成树
原理
- 一棵生成树与对应的图有如下性质:
- 图的所有顶点都在生成树中
- 生成树的边的数量为n-1
所以由此可得
- 要构造一棵最小生成树
- 将图中的边按权值升序排列
- 按次序选出不成环且覆盖所有顶点的边的集合
- 选到n-1条边的时候结束(因为大于n-1的时候一定成环)
这里是无后效性的,贪就完事了
Prim是从顶点开始,而Kruskal是从边开始
所以才有稠密稀疏适用性不同的说法
Prim算法
稠密图适用
步骤
- 为空集,选择任一顶点移到中
- 找出边满足
- 权值最小
- 将该边连接的顶点加入A中
- 跳到1,直至A为全部顶点的集合,恰好可以找到N-1条边
- 找出边满足
- 这样遍历出来的树就是一棵最小生成树
Kruskal算法
稀疏图适用
步骤
- 为空集
- 找出边满足
- 权值最小
- 将该边连接的顶点加入A中
- 跳到1,直至A为全部顶点的集合,恰好可以找到N-1条边
- 找出边满足
- 这样遍历出来的树就是一棵最小生成树
存储结构
存储稠密图时,使用邻接矩阵
存储稀疏图时,使用邻接表
邻接矩阵
定义
设是具有个顶点的图,则的邻接矩阵是具有如下性质的阶方阵:
说人话就是
建立一个的矩阵
如果和有边(弧)的话
就在的位置上标1,反之标0
如果是网
那么就标权值,反之 标
(为编程中允许的,比任何权值都大的数)
- 无向图
- 无向图的邻接矩阵是个对称矩阵
- 有向图
存储表示
//---图的邻接矩阵存储表示---//
#define MaxInt 32767//极大值
#define MVNum 100//最大顶点数
typedef char VerTexType;//数据类型
typedef int ArcType;//权值类型
typedef struct{
VerTexType vexs [MVNum] ;//顶点表
ArcType arcs[MVNum][MVNum] ;//邻接矩阵
int vexnum, arcnum;//图的点数和边数
}AMGraph;
优缺点
- 优点
- 便于判断两顶点是否有边
- 便于计算顶点的度
- 缺点
- 不便于增删顶点
- 不便于统计边的数目
- 空间复杂度高
邻接表
定义
邻接表反映的是顶点的出度邻接情况
逆邻接表反映了顶点的入度邻接情况
以下是邻接表的示例
- 将所有顶点存储到线性表中
- 为每个顶点配备一个单链表
- 在该单链表中存储该顶点关联边(弧)的信息
如图
以顶点为例,它的单链表中有两个结点
存储的值分别是2和1
2,1分别是,顶点在线性表中的下标
两节点分别表示两条弧。
节点构成
- 顶点节点
data
:存一些没啥用的信息first
:指向链表第一个元素
- 弧节点
adjvex
:弧头下标nextarc
:链表的下一个元素info
:一些信息(可能是权值)
存储表示
//---图的邻接表存储表示---//
#define MVNum 100//最大顶点数
typedef struct ArcNode{//边
int adjvex;//该边所指向的顶点
struct ArcNode *nextarc;//指向下一条边
OtherInfo info;//信息(比如权重)
}ArcNode;
typedef struct VNode{//顶点
VerTexType data;//顶点信息
ArcNode *firstarc;//指向第一条边
}VNode, AdjList[MVNum];//AdjList表示邻接表类型
typedef struct{
AdjList vertices;
int vexnum, arcnum;//图的顶点数和边数
}ALGraph;
优缺点
- 优点
- 便于增删顶点
- 便于统计边的数目
- 空间复杂度低
- 缺点
- 不便于判断两顶点是否有边
- 不便于计算顶点的度