- 博客(14)
- 收藏
- 关注
原创 点分治解析
但有些题目没有给定的起点和终点,如果强行使用LCA,就会得到O(n^2logn)的时间复杂度。当然,这时候也可以直接挨个点暴力DFS遍历,那样也会得到O(n^2)的时间复杂度。有了些前置处理后,当K的上限比较小时,我们可以用桶来存路径的长度,当两段路径到一个点的路径之和等于所需值时即可,这也是该算法的关键。点分治和直接暴力遍历的最大区别就是:不遍历所有点,而是遍历重心。由此,就可以对时间复杂度进行优化,达到O(nlogn)。另外,还需要从重心开始遍历,得到其子树中所有节点到重心的距离,代码如下。
2025-05-06 21:08:49
474
原创 网络流之最大流(Dinic)
不是最大流,但增加它会阻塞分层图中的所有路径。每次找到阻塞流后,必须重建分层图才能继续增广。Dinic算法每次迭代找到一个阻塞流,而非单条增广路径。在DFS中只允许向更深层的节点推进,避免“绕远路”。可以避免重复检查,每次重建分层图后要重置iter数组。此外,之后反向边的更新并不会影响之前的边。在了解了Ford-Fulkerson 和Edmonds-Karp之后,我们可以进一步学习更高效的算法——Dinic。首先我们要知道Dinic中几个重要的概念和优化。,实际运用过程中是比EK算法快的。
2025-04-26 20:16:36
430
原创 网络流之最大流(Edmonds-Karp)
先前已经实现了Ford-Fulkerson求最大流,但对于最大流较大的题目会超时,这时我们引入一种新的算法,Edmonds-Karp算法。该算法时Ford算法的优化,相比于Ford,可以ac洛谷模板题,且代码长度相差不大。因此,大多数情况下在这两者间我们会选择后者(如果不会Dinic等优化方法的话)。代码总体与Ford-Fulkerson求最大流相似,详细我会在代码中说明。可见,BFS找增广路径可强制走最短路径,提高了算法的效率。(V=顶点数,E=边数),总时间复杂度。),DFS 会极其缓慢甚至无法终止。
2025-04-24 21:20:08
502
原创 网络流之最大流(Ford-Fulkerson)
初学网络流还是很懵的,尽管有一点二分图匹配的经验,面对一堆不熟悉的术语还是应接不暇。因为每天很忙已经很久没有写文章了。最近在学习上有点卡进度,这几天有点颓废,故重拾博客,助力自己学习。推荐大家在感觉脑子比较乱的时候通过类似的方式来梳理一下。
2025-04-24 19:09:50
401
原创 树的最近公共祖先(LCA)倍增求法
最近公共祖先(LCA):即给出两个节点x和y,找到他们不断向上爬首次共有的祖先。如图所示,8和6的公共祖先为1,10和7的公共祖先为3,4和5的公共祖先为2。如果使用朴素算法来解决问题,时间复杂度将会达到o(n^2),这里我们将使用倍增法,时间复杂度为o(nlogn)。那么倍增法该怎么做呢。我们将建立以个二维数组fa[i][j],其中i代表该节点,j表示向上走2^j,fa[i][j]即表示i节点向上走2^j后到达的节点。
2025-01-06 09:18:21
886
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅