摘要:
【需要解决的问题】 对一个有向无环图(DAG)拓扑排序。 拓扑排序就是,对图上的点进行排序,使得排在后面的点不能通过一条路径到前面的点。 比如下面这个图: 其中一个拓扑排序是1,2,3,4,5;而1,2,5,3,4就不行,因为3能到达5。 因此可以得出: 用一个队列实现,先把入度为0的点放入队列,每 阅读全文
摘要:
先来说说什么是树。 树实际上是图的一种,当一个有N个点的无向连通图,只有N-1条边时,就是一棵树,即树中不会有环出现;所以对于一个图,删除某些环中的某条边,使得该图成为一棵树,那么这棵树就称为生成树。 而最小生成树的意思就是,给定有n个顶点的带权图G(E,V),找到一棵生成树,求该生成树的边权和。 Kruskal算法: 算法步骤: 1.构造一个有n个顶点的无边子图; ... 阅读全文
摘要:
在学习最小生成树的两种算法前,先学下并查集。 并查集的思想是,对于一个集合,使用集合中的一个顶点作为特殊点,集合里所有的点都与此特殊点直接相连;而并查集的查询,就相当于查询两个两个顶点是否为同一个父亲,这也是findSet(x)里之所以有fa[x]==x时,fa[x]=x的原因。 并查集之查询、合并 模板如下: int fa[30010]; void makeSet(i... 阅读全文
摘要:
先说前三种,主要解决的问题是:“求a点到b点的最短路”,解决方法是:用以下三种算法中的一种,求出a点到其他所有点的最短路,即可知道a点到b点的最短路。 前三种最短路算法是:Dijkstra(及优先队列优化),Bellman-Ford,SPFA(实际上就是BF的优化版)。 Dijkstra算法: (要求边权只能大于等于0) 未优化 O(N2): 贪心... 阅读全文
摘要:
【概念】疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图。 Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵。 邻接矩阵: 开一个二维数组graph[ ][ ]来记录图中点a与点b之间是否连通,初始化为0(或者-1之类的看情况);如果图中有可忽略的重边(如 只需重边中的最小边或最大边),则保存需要的那条边的边权,但如果有无法忽略的重边,就一... 阅读全文