图论(理论篇)
图论(理论篇)
图的概念
-
图:G=(V,E),由顶点集和边集组成
-
有向图
- 强连通图:任意两个顶点可以相互到达
- 有向树:一个顶点的入度为0,其余顶点的入度均为1 的有向图
- 顶点的度=入度+出度
-
无向图
- 连通图:任意两个顶点是连通的
- 生成树:包含图中所有顶点的一个极小连通子图
- 最小生成树:边权之和最小且唯一;边数=顶点数减1
- 顶点的度:依附于该顶点的边数,
-
完全图:任意两个顶点都存在双边
-
稀疏图:边数少的图,一般E<V log V
- 邻接表法:所需空间:O(V+E);顶点表+边表
- 方便找出给定顶点的所有边
- 邻接表法:所需空间:O(V+E);顶点表+边表
-
稠密图:边数多的图
-
邻接矩阵法:所需空间:O(V2);g[i] [j]代表从i到j有一条边
- 方便查询任意两个顶点间是否有边
- 方便求任意一个顶点的入度,时间复杂度为O(边数+顶点数)
- 无向图的邻接矩阵是一个对称矩阵:数据量较大时可据此进行压缩处理,只采用一维数组存储,省略半边的数据
-
-
图的性质
-
度
- 有向图:全部顶点的入度之和== 出度之和 == 边数
- 无向图:全部顶点的度之 == 边数的2倍
- 邻接矩阵中
- 有向图:第i行非零元素的个数是顶点i的出度;第i列非零元素的个数是顶点i的入度
- 无向图:第i行/列 非零元素的个数是顶点i的度
-
连通
- 强连通图:边数>=顶点数;边最少的情况:构成一个有向环
- 连通图:边数>=顶点数-1;边最少的情况:构成一棵树
-
完全图
- 有向完全图:n个顶点有n(n-1)条边
- 无向完全图:n个顶点有n(n-1)/2条边
- 可用以计算有x条边的非连通无向图至少有几个顶点:x条边的完全图顶点为n,n再加1后即构成了一个非连通无向图
- 可用以计算n个顶点的无向图至少需要几条边能确保是一个连通图:n-1个顶点构成完全图需要x条边,x+1条边保证第n个顶点与该完全图相连
图的应用
-
优先搜索
-
宽度优先搜索BFS
- 复杂度分析
- 空间复杂度:最坏O(V)
- 时间复杂度:邻接表存储:O(V+E);邻接矩阵存储:O(V2)
- 复杂度分析
-
深度优先搜索DFS
- 复杂度分析
- 空间复杂度:O(V)
- 时间复杂度:邻接表存储:O(V+E);邻接矩阵存储:O(V2)
- 复杂度分析
-
其他优先搜索的题目:手工模拟一下宽搜或者深搜的过程即可求解
-
-
最小生成树
- Prim算法:每次取集合外 离集合距离最短的点,放入集合,并用该点更新 其他各点到集合的距离
- Kruskal算法:对每条边的边权从小到大开始枚举,如果两个点不连通,就将两个点放进集合,直到所有的点都在集合中
-
最短路算法
- Dijkstra算法:每次取 集合外 离源头距离最短的点,放入集合,并用该点更新 其他各点到源头的距离
- Floyd算法:A[i] [j]=min(A[i] [j],A[i] [k]+A[k] [j]),三重循环遍历所有的边
-
拓扑排序
- 有向无环图DAG图:有向图中不存在环、
- AOV网:顶点表示任务,有向边表示任务间的先后关系(边无权值)
- AOE网:顶点表示事件,有向边表示活动(边带权值)
- 仅有一个入度为0的顶点表示源点,仅有一个出度为0的顶点表示汇点
- 关键活动:从源点到汇点的所有路径中,具有最大路径长度的路径为关键路径,关键路径上的活动成为关键活动
- 拓扑排序:选择AOV网中入度为0的顶点并输出,删除该顶点以及该点出发的所有有向边,重复操作
- 复杂度分析
- 时间复杂度:邻接表存储:O(V+E);邻接矩阵存储:O(v2)
- 复杂度分析
- 有向无环图DAG图:有向图中不存在环、