目录
10.关键路径
1.图的基本概念
1.1定义与术语
1.1.1定义
图G由顶点集V和边集E组成,记为G=(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若,则用 |V| 表示图G中顶点的个数,也称图G的阶,
,用 |E| 表示图G中边的条数。
G:Graph;V:Vertex;E:Edge
注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集
1.1.2有向图 VS 无向图
1.1.3简单图 VS 多重图
1.1.4顶点的度、入度、出度
无向图:每条边为顶点贡献两个度。故顶点的度为 2|E|
有向图:每条弧(A->B)为顶点B贡献一个入度和为顶点A贡献一个出度,故所有顶点的入度之和=出度之和= |E|
1.1.5顶点间的关系描述
1.1.6连通图 VS 强连通图
连通图:无向图;求非连通图最多几条边——孤立其中一个顶点,其他n-1个顶点两两连接
强连通图:有向图
1.1.7子图
生成子图:包含原图的所有结点
无向图中的子图:
有向图中的子图:
1.1.8连通分量和强连通分量
连通分量是无向图的子图,连通且极大。
无向图的连通分量:
有向图的强连通分量:
1.1.9生成树和生成森林
连通图的生成树(无向的):尽可能包含更少的边(极小);不唯一
哪种生成树是最优的?——最优带权路径
生成森林:
非连通图->若干个连通分量->对应的生成树->生成森林
1.1.10边的权、带权图/网
1.2几种特殊的图
完全图:最多的边
稀疏图 VS 稠密图
有向树入度为0的顶点视为根
2.图的四种存储结构
2.1邻接矩阵法(顺序存储)
2.1.1方法实现MatrixGraph
存储不带权图:
#define MaxVertexNum 100 //顶点数目最大值
typedef char VertexType;
typedef int EdgeType;//或bool
typedef struct{
VertexType Vex[MaxVertexNum];//顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum];//边/弧表(邻接矩阵)
int vexnum,acrnum; //当前顶点数,边/弧数
}MGraph;
顶点表可以根据实际情况用其他数据类型以表示更复杂的信息
邻接矩阵用bool(1B) 存储0、1更节省空间
无向图:求顶点的度——遍历单行或单列
有向图:
求顶点的入度——遍历单列
求顶点的出度——遍历单行
求顶点的度——遍历单行和单列
存储带权图:
自己到自己的权设为0或无穷都可
性能分析:
缺点:数组实现的顺序存储,空间复杂度高,不适合存储稀疏图。
2.1.2邻接矩阵的性质
证明见离散数学图论
邻接矩阵法要点回顾:
如何计算指定顶点的度、入度、出度(分无向图、有向图来考虑)?时间复杂度如何?
如何找到与顶点相邻的边(入边、出边)?时间复杂度如何?
如何存储带权图?
空间复杂度―—,适合存储稠密图
无向图的邻接矩阵为对称矩阵,如何压缩存储?
设图G的邻接矩阵为A(矩阵元素为0/1),则的元素