目录
1、图
1、图的基本概念:
- 有向图用<a,b>表示,无向图用(a,b)表示。
- 简单图:不存在重边、不存在顶点到自身的边。
- 简单路径:顶点不重复出现的路径。(除去第一个和最后一个顶点其余顶点不重复出现的回路叫简单回路)
- 完全图:任意两个顶点均有边存在(完全图一定是连通图)(有向图n(n-1)条边,无向图n(n-1)/2条边)。
2、联通图与连通分量:(找图中有多少连通分量???)
- 连通图:无向图中任意两点都是连通的。
- 连通分量(对于非连通图来说的):无向图的极大连通子图。
- 极小连通子图(生成树):若n个点则只有n-1个边。(多加一个就生成环,少加一个边就不连通)
- 强连通分量和强连通图是指有向图。
- 强连通分量个数:①找入度和出度为0的点,依次删除该点和相对应的边,直到没有入度和出度为0的点。②删除掉的所有顶点数加上最后一个连通图。
3、顶点的度:所有顶点的度(顶点a的度:某一个顶点的度)
4、n个顶点,保证连通最少要多少边:n-1个顶点组成完全图再加最后一个顶点。
2、图的存储
1、邻接矩阵:
- 稠密图适用邻接矩阵,复杂度O(n*n),邻接矩阵表示法唯一,邻接表不唯一。
- 二维数组的n次方:图中两个点长度为n的路径个数。
2、邻接表:
- 结合顺序存储和链式存储,节省空间避免浪费。稀疏图适用于邻接表。
- 删除某个点相关的所有边:入度和出度,遍历整个表,O(n+e)。
- 顶点在边表出现的次数:该顶点的入度。
- 无向图存储空间O(n+2e),因为每条边遍历两次,有向图存储空间O(n+e)
3、十字链表:
- 十字链表:是有向图的一种链式存储结构。
- 步骤:先画邻接表,再一次从前往后找后面存储的第二位数字与其相同的,并指向它。
4、邻接多种表:
- 是无向图的一种链式存储结构。
3、图的遍历
1、时间复杂度和空间复杂度:
- **邻接表:****BFS和DFS时间均为O(n+e),空间复杂度均为O(n),**需要借用一个数组进行标记,故为O(n)。
- **邻接矩阵:****BFS和DFS时间均为O(n*n),空间也均为O(n*n),**二维数组故为O(n*n)
- 图的遍历不一定必须是连通图,非连通图需要调用两次或两次以上的遍历算法
- BFS借用队列,放入队列中,依此进依次出。
4、最小生成树
1、生成树的定义:
- 生成树、深度优先生成树、广度优先生成树、最小生成树。
- Kruskal、Prim算法
2、最小生成树:
- 有权值相同的边,最小生成树****可能不唯一;只要没有权值相同的边,则最小生成树一定唯一。
- 大题唯一不唯一:只要最小的边都被选了。且最后一个或几个加入的边只有这一种选择,则唯一。(因为加入其他的边就重合)(大部分是的,具体的具体分析)
- 最小生成树虽可能不唯一,但权值最小唯一,边值也唯一(点数减一),且无法保证任意两点之间是最短路径。
3、Kruskal算法:
- **围绕边进行选择,**对边进行权值排序,依次判别加入。
- 不依赖顶点V,边排序O(elge)。(适用于边稀疏但顶点多)
4、Prim算法:
- 围绕顶点进行选择。(任选一点加入集合,依次找其最近的邻居)
- 不依赖于边E,适合边稠密的图,时间O(v*v)
5、最短路径
1、BFS算法:
- 单源最短路径:从一个顶点到其余各顶点的最短路径。
- 只适合于无权图。时间复杂度O(v*v)或O(v+e)。
2、Dijkstra算法:基于贪心策略
- 单源最短路径:从一个顶点到其余各顶点的最短路径。(画图找最小千万不要大意)
- 若求每对顶点最短路径,则O(n^3)
- 只适合无权图、有权图(不适合负权值的图)时间O(n*2)
3、Floyd算法:
- 求各顶点之间的最短路径
- 适用于无权图、有权图、负权值的图。时间O(n*n*n)
4、判别有环:
深度优先搜索
广度优先搜索
关键路径
并查集:
1、有向无环图描述表达式:先将运算符的运算顺序在下面依次标记
然后将字母不重复地依次排开(不能出现重复的操作数顶点)
最后按照运算符顺序进行有向箭头连接
6、拓扑排序
1、拓扑排序性质:
- 强连通图不能进行拓扑排序。
- <a,b>表示活动a先于b活动进行,即不存在b到a边。
- 即使拓扑排序唯一,也无法确定该图(仅唯一但可能有多个指向)
- 若一个顶点有多个直接后继,则拓扑排序不唯一。
2、拓扑排序:
- 先选择一个没有前驱的顶点,输出它
- 再删除该顶点以及从该顶点出发的边(然后重复前两步)
3、逆拓扑排序:
- 先选择一个没有后继的顶点,输出它
- 再删除该顶点以及从到达该顶点的边(然后重复前两步)
4、关键路径:具有最大路径长度的路径
- 关键路径是以拓扑排序为基础的。
- 最迟时间:弧指向的顶点的时间减去弧所持续的时间。
- 只有当所有关键路径同时减少时才能缩短工期
