合集-图论
摘要:注:我们这里定义 \(mof=0x3f3f3f3f\),\(MOF=0x3f3f3f3f3f3f3f3f\),表示最短路径的无穷大,\(|V|\) 表示图中顶点数,\(|E|\) 表示图中边数。 \(Dijkstra\) 算法 1、原方法时间复杂度是 \(O(|V|^2)\) 的,是直接用 \(qu
阅读全文
摘要:树的直径 1、两种方法解决:一种是通过两次 \(dfs\) 遍历得到最大直径,一种是通过树形 \(dp\) 求出每个节点中子树节点到此节点的最大距离和次大距离。 2、两种时间复杂度都是 \(O(n)\),空间复杂度也都是 \(O(n)\)。 3、但是前者方法只能处理非负边权或非负点权的直径,对于有负
阅读全文
摘要:倍增法 1、通过一个倍增数组来向根节点预处理出以每个顶点不同深度的值,然后在通过两点之间的深度差值化为等深度,最后得到最近公共祖先的节点,也可得到两点的最短路径值。 2、时间复杂度:\(O(nlogn)\),空间复杂度:\(O(nlogn)\)。 3、模版:洛谷P3379。 4、倍增算法求 \(lc
阅读全文
摘要:点分治 1、通过重儿子这个特性,每次遍历重儿子,每次找到的重儿子都能将重儿子的每个子节点的子树都几乎平均分割为 \(log\) 大小,所以最多 \(log\) 层,每层差不多 \(n\) 个节点,最终时间复杂度就为 \(nlogn\)。 2、可以用于解决两点之间的距离为 \(k\) 的数目有多少等等
阅读全文
摘要:树上启发式合并 1、给一棵根为 \(1\) 的树,每次询问子树颜色种类数。 2、模版:洛谷U41492。 3、时间复杂度:\(O(nlogn)\),空间复杂度:\(O(n+m)\)。 4、启发式合并主要依靠的是灵活的树的 \(dfs\) 遍历,是利用重儿子的子树大小 \(\ge \frac{n}{2
阅读全文
摘要:虚树 1、虚树是将一个树的点集的某一个子集,以及该子集中点的 \(LCA\) 的集合,一起所重构出来的一棵树。和\(targen\) 一样都是缩点。 2、用到的方法是二次排序以及 + \(lca\) 连边,排序主要是根据遍历时的 \(dfs\) 序来排列的,小的排前面。 3、时间复杂度:\(O(nl
阅读全文
摘要:树链剖分(树上点权问题) 1、树链剖分之树上线段树:求解路径值,路径大小,路径 \(rmq\),等等 \(...\) (求路径点权之和)。 2、时间复杂度:\(O(nlog^{2}n)\),空间复杂度:\(O(nlogn)\)。 3、模版:洛谷P3384,提升:洛谷P10799。 template<
阅读全文
摘要:\(kruskal\) 算法 struct Kruskal{ struct node{ int u, v; i64 w; bool operator<(const node &t) const { return w < t.w; } }; int n, m, cnt; i64 ans; vector
阅读全文
摘要:\(Tarjan\) 缩点 有向图缩点 struct SCC { int n, m; vector<int> head, from, to, nxt; vector<int> weight; int totEdge = 1; void add(int x, int y, int z = 0) { +
阅读全文

浙公网安备 33010602011771号