图的相关概念
1、有点有边
2、有向图、无向图、成环
3、完全图、稀疏图、稠密图
4、连通图 - > 生成树 //
5、度、出度、入度
存图
声明n个点,m条边
1、邻接矩阵
时间复杂度、空间复杂度O(n^2)
G[i][j]:从i点到j点的边权
初始化
O(1)查询两点是否有边
遍历、初始化之类的效率都低,二维数组很容易爆
2、邻接表
前向星
以存储边的方式来存储图,把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,
并记录下以某个点为起点的所有边在数组中的起始位置和存储长度。
3、链式前向星
拓扑排序
O(m+n)
有向无环图 (可以用来判断有向无环图
拓扑序
拓扑排序:判断是否存在拓扑序,并求出拓扑序的过程。
一般例子有先修课
入度为零
从有向图中选取一个入度为0的顶点输出,再从中删去此顶点以及所有以它为尾的弧。借助队列。
将所有入度为0的点扔到队列。
while(队列非空)
{
取队首P
访问队首的所有相邻点Q 并将其入度减一
若Q此时的入度为0 Q入列
}
最短路
djkstra
O(n^2)
单源最短路,只能是正边权,贪心
①选定一个点
a. 未被选过
b. 距离最短 (贪心)
②对于这个点的所有邻接点去尝试松弛
堆优化的djkstra
bellman-ford
O(n*m)
单源最短路,不能有负权环,但可以有负边权
spfa
最好O(m),最坏O(n*m)
队列优化的bellman-ford,可以存在负环
floyd
O(n^3)
dp思想
最小生成树
1、prim
O(n*n+m) 稠密图
加点法
2、kruskal
O(m*log(m)) 稀疏图
加边法
结合并查集