定义
注:
- 顶点集合V有穷非空
- 任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示。
- 无向图中的极大连通子图称为连通分量,有向的则称强连通分量。
- 要是子图
- 子图要是连通的
- 连通子图含有极大顶点数
- 具有极大顶点数的连通子图包含依附于这些顶点的所有边
- 无向图中连通且n个顶点n-1条边叫生成树。有向图中一顶点入度为0其余项点入度为1的叫有向树。
类型:
(1)简单图:不存在顶点到其自身的边,且同一条边不重复出现
(2)无向完全图:无向图中,任意两个顶点之间都存在边
(3)有向完全图:有向图中,任意两个顶点之间都存在方向互为相反的两条弧
(4)有很少条边或弧的图称为稀疏图,反之称为稠密图
抽象数据类型
存储结构
邻接矩阵
邻接表
图的遍历与连通性
深度优先遍历(DFS)
- 它从图中某个顶点V出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到。
- 若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点做起始点,重复上述过程,直至图中所有顶点都被访问到为止。
注:
对于n个顶点e条边的图来说:
邻接矩阵:O(n*n)
邻接表:O(n+e)
对于点多边少的稀疏图来说,邻接表结构使得算法在时间效率上大大提高。
广度优先遍历(BFS)
深度优先更适合目标比较明确,以找到目标为主要目的的情况,而广度优先更适合在不断扩大遍历范围时找到相对最优解的情况。
最小生成树
把构造连通网的最小代价生成树称为最小生成树。
Prim
Prim算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树。
O(n*n)
Kruskal
Kruskal算法主要是针对边来展开,边数少时效率会非常高,所以对于稀疏图有很大的优势;
而Prim算法对于稠密图,即边数非常多的情况会更好一些。
最短路径
Dijkstra算法
每一对顶点之间的最短路径
Floyd算法
拓扑排序
基本概念
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的图为顶点表示活动的网,我们称为AOV网(Activity On Vertex Network)
- AOV网中的弧表示活动之间存在某种制约关系
- AOV网中不能存在回路
基本思路
从AOV网中选择一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直至输出全部顶点或者AOV网中不存在入度为0的顶点为止。
关键路径
基本概念
- 在表示一个工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网(Activity On Edge Network)
- 路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径叫关键路径,在关键路径上的活动叫关键活动。