- 博客(42)
- 收藏
- 关注
原创 差分约束
源点需满足的条件:从源点出发,一定可以到达所有的边求最短路:1.先将每个不等式xi<=xj + ck,转化成一条从xj走到xi,长度为ck的一条边2.找一个超级源点,使得该源点一定可以遍历到所有的边3.从该源点求一遍单源最短路结果1:如果存在负环,则原不等式一定无解结果2:如果没有负环,则dist[i]就是原不等式组的一个可行解问题:如何转化xi<=c,其中c是一个常数,这类的不等式方法:建立一个超级源点0,然后建立一条0->i,长度为c的边。
2024-03-09 14:31:22 391
原创 SPFA找负环
2.统计当前每个点的最短路中包含的边数,如果某个点的最短路的所包含的边数大于等于 n,则说明也存在环。01分数规划:二分 -> 整理不等式 -> 重新定义边权 -> 判断图中是否存在正环。1.统计每个点入队的次数,如果有个点入队n次,则说明存在负环。当所有点的入队次数大于2n时,我们就认为图中有。
2024-03-08 16:00:56 372
原创 最小生成树的扩展应用
定义:给一个带权的图,把图的所有生成树按权值从小到大排序,第二小的称为次小生成树(有些题目最小生成树不唯一,次小生成树可以和最小生成树相等)找到一个最小的d值,将所有权值大于d的边删去,整个图形连通块的数量不超过k条。
2024-03-07 17:37:42 375
原创 最小生成树的典型应用
假设不选当前边,得到了一棵树,然后将这条边加上,那么必然会出现一个环,在这个环上,一定可以找出一条不小于当前边的边,那么把当前边替换上去,结果一定不会变差。
2024-03-06 22:47:18 420
原创 单源最短路的综合应用
单源最短路和二分的结合。本质上是求最大值最小,联想到二分法来求。从1到n,最少经过的长度大于x的边的数量是否小于等于k。dp问题绝大部分上是拓扑图上的最短(最长)路径问题。单源最短路和暴搜的结合。
2024-03-03 17:04:28 384
原创 DFS之剪枝与优化
1.优化搜索顺序:在大部分情况下,我们应该优先搜索分支较少的结点2.排除等效冗余(在不考虑顺序的情况下,尽量用组合的方式来搜索)3.可行性剪枝4.最优性剪枝5.记忆化搜索可以用一个九位的二进制数来表示一行的状态。
2024-02-29 18:36:23 817
原创 BFS中的双向广搜和A-star
如果给出的字母序列中逆序对的数量是偶数,那么就有解,如果是奇数,就没有解。(这对于所有奇数码都是成立的,即n为奇数,例如十五数码)这里的估价函数是每个点到终点的最短距离,那么也就是说可用Dijsktra算法反向求一下终点到各个点的最短距离。3.A*算法除了终点之外,并不能保证其他点第一次出队时是最优解,也不能保证每个点只被扩展一次。这道题的估计函数就是:当前状态到它的目标状态的曼哈顿距离之和。1.A*算法一定要在保证有解的条件下用。这个代码超时了,但是还没找到问题在哪里,下次再看看吧。
2024-02-27 22:10:45 526
原创 BFS中的多源BFS-双端队列BFS
这里由于起点(0,0)的横纵坐标是偶数,因为走的是斜线,所以到达的点也一定是偶数。求出每个位置到所有为1的点的最短距离。
2024-02-26 16:04:33 372
原创 2024-02-21(单调队列优化的dp问题)
表示以A[k]结尾的长度不超过m的子序列,就是S(k) - S(k - j),那么当S(k)是确定了的时候,我们要找一个最小的S(k - j),问题就转化为了在m区间内找到一个最小值,就可以用单调队列来求解了。每个点的油量减去前一个点的距离算出每个点的前缀和,也就是说判断最小的前缀和是否为0,那么问题就转化为求区间n的最小值问题,用单调队列求解。
2024-02-22 01:03:44 404
原创 2024-02-20(数位DP)
还是不会。。。其实就是把一个数n转化成B进制的数x,例如x = 654321,那么我们要找的就是在小于x的数里面,在它们的各个位置上填0和1,满足K个1,其他数都是0。
2024-02-20 15:45:07 346
原创 2024-02-18(区间DP)
加add() 减subtract() 乘multiply() 除divide() 两者取最小min() 两者取最大max()先把环形展开,形成一条链,再复制一遍。其中状态划分的依据就是哪个点是根节点。
2024-02-18 23:11:23 380 1
原创 2024-02-17、18(状态压缩dp)
与前两题不同的是,这道题求的不是方案数,而是最大值,也就是说把所有子集的最大值与当前行的最大值相加就可以了。另外,由于攻击范围如图所示,所以在枚举的时候,要枚举到 i -2 行。暴力搜索:用某种顺序来枚举到所有的方案。两个状态压缩dp的题目。
2024-02-18 14:37:56 365 1
原创 2024-02-12(背包模型)
1、当空间优化成一维之后,只有完全背包问题的体积是从小到大循环的。2、循环形式:for 物品for 体积for 决策。
2024-02-16 23:12:47 1455 1
原创 2024-02-11 ~ 2024-02-12(最长上升子序列模型)
这道题和最长上升子序列的基本模型的一点区别就是:它要考虑最长上升子序列和最长下降子序列。对于每个数都有两种选择:1.接在某个现有的子序列的后面 2.创建一个新的系统。情况一:现有子序列的结尾数都小于当前数,则创建一个新的子序列。情况二:将当前数放到结尾数大于等于它的最小的子序列的后面。唯一的区别就是要求算出子序列以外的部分,本质上和登山是一样的。条件一:按照编号递增的顺序来浏览(也就是说必须是子序列)要想使得系统的数量最小,那么子序列结尾的数就要尽可能大。目标:求最多能浏览多少景点?这个转化的过程很重要!
2024-02-12 21:58:05 365 1
原创 2024-02-10(动态规划-数字三角形模型)
由于题目限制了商人必须在2n - 1的时间内走出去,也就是不走回头路,就是说只能往右走或者往下走,其实本质上和摘花生这个题是一样的。题目中要求从左上到右下,和右下到左上,其实都可以看作是。然后再考虑一下边界情况就可以了。只有在步数一样的时候才有可能踩到相同的格子。题目本质上和方格取数是一样的,只是矩阵不一样。
2024-02-11 01:31:18 371 1
原创 2024-02-08(贪心算法:区间问题、哈夫曼树)
2.从前往后依次枚举每个区间,在所有能覆盖start的区间中,选择右端点最长的,并将start更新为右端点的最大值。2.从前往后依次枚举每个区间,如果当前区间中已经包含点,则直接pass,否则,选择当前区间的右端点。2.从前往后依次枚举每个区间,如果当前区间中已经包含点,则直接pass,否则,选择当前区间的右端点。2.从前往后处理每个区间,判断能否将其放到某个现有的组中(L[i] > Max_r)如果存在这样的组,将其放进去,并更新当前组的Max_r。如果不存在这样的组,则开新组,将其放进去。
2024-02-08 16:46:09 340
原创 2024-02-07(计数类DP、状态压缩DP、树形 DP、记忆化搜索)
上一篇文章里面的dp题目求的都是最大值或者最小值,但是这一道题求的是个数。根据题意,可以看成1-n个数装满容量为n的背包,而且每个数可以用无限次,所以可以联想到完全背包问题,用来做。
2024-02-08 00:57:57 377
原创 2024-01-31(最短路径)
上面两道题的n,m的数据范围不一样,因此数据存储方式也不一样,所用的Dijkstra算法也不一样。朴素的Dijkstra算法和堆优化的主要区别就是 找不在st中距离起始点最近的点。是限制最小的算法,一般来说,只要没有负环,都可以用SPFA算法。2.而堆优化的利用优先队列可以直接得到最近的点。稠密图要用邻接矩阵来存储,稀疏图用邻接表来存储。1.朴素的要用for循环遍历。
2024-01-31 23:19:16 376
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人