![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
AcWing算法提高课 课程记录
文章平均质量分 95
.SacaJawea
这个作者很懒,什么都没留下…
展开
-
第二章 搜索 No.2多源bfs,最小步数与双端队列广搜
假设建立了虚拟源点,将虚拟源点入队,进行bfs。那么第一次扩展,虚拟源点会将其他所有源点入队,并更新它们的最短距离为0(因为源点为1,因此1到1的最短距离为0),然后再用这些源点向外扩展。与图论中的多源最短路:求任意两点间的最短距离不同,多源bfs求的是多个源点到多个终点中的最近终点距离,即多源bfs的源点与终点所属集合是任意两点间这个集合的子集。考虑将多源问题转换成单源问题,建立虚拟源点,在虚拟源点与其他源点之间建立权值为0的边,那么从虚拟源点到终点的最短距离在数值上与多个源点到终点的最短距离相等。原创 2023-08-17 07:14:30 · 72 阅读 · 0 评论 -
第二章 搜索 No.1BFS之Flood Fill与最短路模型
因为不仅要扩展高度相同的格子,还需要将当前格子与边界进行比较,若边界的高度为当前格子不同,而边界格子被标记过,那么就会错过比较。一般bfs的扩展都是4个或8个方向,虽然这题的扩展是8方向,但是扩展的位置与平时不同,所以需要特别小心地处理坐标。debug:st数组标记已经访问过的格子,并不是标记和当前bfs的连通块的高度相同的格子。若存在高于h的格子,higher为true,若存在低于h的格子,lower为true。所有高度相同的格子为一个连通块,bfs时判断连通块的相邻格子与连通块的高度h关系。原创 2023-08-16 16:28:24 · 85 阅读 · 0 评论 -
第三章 图论 No.13拓扑排序
条,由于这些边的权值相同,可以在这些边中创建一个虚拟点v,未经过的点分别向v连一条权值为0的边,v向经过的点分别连接一条权值为1的边。这样,从未经过的点到经过的点的权值和依然为1,但是需要建立的边数为。,假设图中有N个点,那么bitset的长度为N,每个点都用一个bitset记录其集合,1表示i能递达这个点,0表示不能递达。分析题意:对于每一条路线,未经过的站点的等级一定小于经过的站点等级,并且最低的站点等级为1级。一条路径中未经过的站点将向经过的站点连接一条权值为1的边,一共。原创 2023-08-15 14:50:47 · 989 阅读 · 0 评论 -
第三章 图论 No.12欧拉回路与欧拉路径
小学一笔画问题,每条边只经过一次判断图是否存在欧拉回路:判断图是否连通(存在孤立边),再根据有向/无向具体判断对于无向图来说,欧拉路径中,起点和终点的度数为奇数,中间点的度数为偶数起点和终点:开始和结束时必须经过一条边,其余情况为:从一条边进入,再从另一条边离开,即度数为1 + 2 * n中间点:一条边进入,一条边离开,度数为2 * n欧拉回路中,所有点的度数为偶数七桥问题中,由于每个点的度数为奇数,所以不可能存在欧拉路径。原创 2023-08-14 11:10:59 · 2152 阅读 · 0 评论 -
第三章 图论 No.11二分图,匈牙利算法与点覆盖
矩阵的奇数格和偶数格(横纵坐标之和)染上不同的颜色,相同颜色的为一组,那么整个矩阵就能被分成两个集合,由于只有相邻格子之间存在边,所以集合中的不存在边,只有集合之间存在边。最终将得到最优解ans,所有大于ans的边组成的图为二分图,若是图中有边的权值小于ans,那么这个图就不是二分图。建图方式很特殊,将每个格子看成点,相邻格子之间连一条边,问题就转换成了从图中选择最多的边,使得每条边的点都不重复。从二分图的非匹配点开始,经过非匹配边,匹配边,非匹配边,匹配边…枚举所有奇数格(或者偶数格),试着将其匹配。原创 2023-08-13 11:06:12 · 689 阅读 · 0 评论 -
第三章 图论 No.10无向图的双连通分量
无向图有两种双连通分量边双连通分量,e-DCC点双连通分量,v-DCC桥:删除这条无向边后,图变得不连通,这条边被称为桥边双连通分量:极大的不含有桥的连通区域,说明无论删除e-DCC中的哪条边,e-DCC依旧连通 (该连通分量的任意边属于原图中的某条环)。此外,任意两点之间一定包含两条不相交(无公共边)的路径割点:删除该点(与该点相关的边)后,图变得不连通,这个点被称为割点点双连通分量:极大的不含有割点的连通区域每个割点至少属于两个连通分量。原创 2023-08-12 19:06:31 · 1069 阅读 · 0 评论 -
第三章 图论 No.9有向图的强连通与半连通分量
连通分量是无向图的概念,yxc说错了,不要被误导强连通分量:在一个有向图中,对于分量中的任意两点u,v,一定能从u走到v,且能从v走到u。强连通分量是一些点的集合,若加入其他点,强连通分量中的任意两点就不能互相递达半连通分量:在一个有向图中,对于分量中的任意两点u,v,一定存在从u走到v或者从v的路径应用:通过缩点(将所有强连通分量缩成一个点)的方式,那么一个有向图就转换成了一个有向无环图DAG(拓扑图)对于拓扑图,可以直接用bfs求最短路问题树枝边(x和y直接相连)原创 2023-08-10 10:42:44 · 739 阅读 · 0 评论 -
第三章 图论 No.8最近公共祖先lca, tarjan与次小生成树
当切除树边,不用再切除非树边就得到两个连通块时,由于题目限制,还需要切除一条非树边,假设非树边有m条,那么此时可以选择m条边中的任意一条切除,此时的方案数为m。时,即x往上跳k步和y往上跳k步后,位于同一个位置,此时找到了一个公共祖先,但不是最近公共祖先,所以这里要减小k的值,直到。假设现在已经用树边建立了一棵树,此时再添加非树边将构成环,将环中的所有树边权值加1,假设初始权值为0,此时可以使用树上差分。若切除树边后,还要再切除一条非树边,才能得到两个连通块时,此时的方案数为1,只能切除这条环中的非树边。原创 2023-08-08 21:46:12 · 1039 阅读 · 0 评论 -
第三章 图论 No.6负环之01分数规划与特殊建图方式
总结下:check判断图中是否存在一个环,其点权之和/边权之和大于等于mid,转换成图中是否存在一个正环(或权值和为0的环),若存在,则l = mid,否则r = mid,考虑新的建图方式,以单词的前两个字符为起点,最后两个字符为终点,建立一条有向边,权值为单词的长度。,最大的答案为每个单词长度都是1000,而最小的答案0是取不到的,最小的情况应该是1,0用来表示无解。debug:dis数组的类型开成int,想着边的权值为整数,int就行,然而边权被重置,类型是浮点数。原创 2023-08-07 15:25:20 · 1941 阅读 · 0 评论 -
第三章 图论 No.5最小生成树之虚拟源点,完全图与次小生成树
此时可以删除这条次大的边,更新次小生成树。每次kruskal选择当前最小边更新时,本质是在建立连通块,初始每个点各自为连通块,数量为n,每次更新连通块的数量-1,更新n-1次选择了n-1条边后,连通块的数量为1,此时最小生成树构建完成。先求最小生成树,枚举不在树中的边,同时删除最小生成树(构成环)中的最大边,使得最终得到的图仍然是一颗树,次小生成树一定在这些树中。与一般的最小生成树问题不同,本题需要在建立电站的电井之间建立电网,在两个电站之间建立电网需要花费金额,可以看成一条具有权值的边。原创 2023-08-06 20:19:28 · 956 阅读 · 0 评论 -
第三章 图论 No.4最小生成树的简单应用
需要注意的是:题目给定的图可能存在多个连通块,若使用prim算法,需要对每个连通块求最小生成树,但是使用kruskal能直接求出所有连通块的最小生成树。需要注意的是,200万条边进行排序会消耗很多时间,由于边的权值只有1和2,所以可以先添加权值为1的边,再添加权值为2的边。添加所有必选的边,维护并查集,然后再对非必选的边做kruskal。的矩阵中,相邻两点之间存在一条边,那么矩阵中的边数应该为。点阵为图中的点,将二维坐标转换成一维,作为点的编号。裸题,稀疏图,套个kruskal的板子就行。原创 2023-08-05 21:52:48 · 1522 阅读 · 0 评论 -
第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增
在计算新连通块的直径最大值时,需要在原连通块与当前新连通块的直径中取max,由于每中不同连接方式都要与原连通块的直径取max,我们可以放到最后在与之取max。可以枚举所有的连接方式,维护出新连通块的直径最小值,将其与原连通块的两个直径比较,取三者的最小值即可。所以在循环k时,就可以枚举所有的i和j,得到包含i,j,k三点的最小环,在这些最小环中取min即可。,其中get_dis表示两点间的距离,dmax(i)表示在原连通块中,i与距离i最远的点的距离。直径概念:同一连通块中,两个距离最远的点之间的距离。原创 2023-08-05 16:47:24 · 2116 阅读 · 0 评论 -
第三章 图论 No.2单源最短路之虚拟源点,状压最短路与最短路次短路条数
而spfa的更新不具有拓扑序,即不存在最短路树,要是图中存在负权边,无法使用天然具有拓扑序的bfs和dijkstra时,只能先用spfa求出最短路,维护出最短路树,再求最短路条数。对于spfa,由于它是暴力算法的优化,每个点都会入队与出队多次,所以spfa的更新不具有拓扑序,已经出队(更新完成)的点可能影响被后续入队的点影响。对于BFS,由于每个点只会入队一次且只会出队一次,说明BFS的更新天然地具有拓扑序,因为出队的点不会被后续入队的点影响。这里涉及到二维坐标到一维的转换,然后用邻接表存储图。原创 2023-08-04 17:06:08 · 2857 阅读 · 0 评论 -
第三章 图论 No.1单源最短路及其综合应用
虽然这题的边权为正,但是这题的状态不是由之前的状态累加,而是从之前的状态中取min或者max,这就导致dijkstra每次的更新无法求得最优解,需要后续的再次更新,此时的时间复杂度无法保证,这是最关键的,所以不使用dijkstra。两种特殊情况:ans为0,说明1~n的所有路径中,至少存在一条路径,经过了k条权值大于0的边,那么第k+1条边的权值为0,需要支付金额为0。若每条边的权值为实际转账的金额比例,那么从起点到终点,这个比例越大,花费的初始金额就越少,所以这题需要找一条从起点到终点比例最大的路径。原创 2023-08-04 08:38:32 · 2415 阅读 · 0 评论 -
第四章 No.2单点线段树的介绍与使用
只要保证查询区间与根节点表示的区间有交集,由于我们每次递归查询的时候,只会选择有交集的区间进行递归,没有交集的区间就不会选择,所以每次判断的时候不会遇到当前区间与查询区间没有交集的情况。当前区间的前缀和要如何维护?有两种情况:1. 左子区间的最大前缀和 2. 左子区间和加上右子区间的最大前缀和,当前区间的最大后缀和也是同理,所以节点还需要维护。但是这题要查询的是最大连续子段和,不能从左右子区间的最大连续子段和推出当前区间的最大连续字段和,因为还有一种情况存在:左子区间的最大后缀+右子区间的最大前缀。原创 2023-07-31 10:38:22 · 117 阅读 · 0 评论 -
第四章 No.1树状数组的原理与使用
维护着数组中的某段区间和,并且这些区间之间存在着重叠,修改数组中的任意一个数后,必定会向上影响其的父节点的区间和,此时只能通过子节点不断地更新到根节点,才能维护正确的数据。经过归纳,求前i个数的和时,需要对树状数组中的数进行累加,这些数的下标从i开始,不断地减去最后一位1,直到i为0。这便是树状数组名字的由来,十分的形象,思考父子节点之间的关系。分别求出区间中的每个数吗?2. 求原数组的某个数时,使用树状数组的sum操作即可,时间复杂度为。的x即可,此时的x就是剩下身高中第k小的身高,这个用二分可以实现。原创 2023-07-29 10:54:56 · 125 阅读 · 0 评论