- 博客(5)
- 收藏
- 关注
原创 G. Rudolf and Subway
这是题目中第一个样例给出的图,我们不妨来考虑一下,如果是2->6的换乘最少次数是多少,很明显是1。这道题其实很像dijislktra,我原本的做法是用换乘次数少(我用了个set在优先队列中,set.size()就是换乘次数)的去更新下一个点,但是当出现相同换乘次数时就会出现误差,比如2->6我从2出发走到4 、3,此时4、3的换乘数量都是1,如果下一个先遍历到的点是3,那么6位置就会被更新,且根据dijisktra原理,更新后进行标记不再更新,导致6位置的答案永远停留在了2。
2025-01-13 11:05:03
768
原创 Acwing.347. 野餐规划
Step3. 优化:如果连通块用完后s还有剩余,可以用剩下的s进行优化,如出现已成的树中有个点为x,x与park有相连,且x->park的其他路径中含有 比(1,park)的权值大的边,则可以将该边断开,连接(1,park),总权值减少,且仍能保证park通向所有点。这里我直接使用了暴力求解,由于被替换的边可能有多个,而我们的最优解是找到被替换后的减少量最大的那几个值,所以可以通过暴力找到最大,即在每一次的遍历中标记出最大替换的位置,并进行断开边和连接边的操作,从而使总权值达到最小。
2025-01-07 21:05:38
422
原创 Codeforces Round 995 (Div. 3)C~E
找到满足条件的a[j]即可,先进行排序,使整个数组单调,再枚举每个a[i],再通过二分找到a[j]的左右边界位置,这里可以直接使用lower_bound(a.begin()+i,a.end(),sum-x)找到左边界,再通过upper_bpound(b.begin()+i,b.end(),sum-y)找到右边界,这里右边界使用upper的是因为如果出现一个数是满足的但是这个数出现了多次,用lower会导致到第一个数就停下了,所以用upper去避免这个问题,之后再把右边界往左边移一个位置就ok了。
2024-12-26 18:56:54
800
原创 牛客小白月赛106——D.太阳系DISCO
可以注意到,当这个点移动到另一端的时候,会开始从新的路径前进,如果前进到某个点再次使用移动到另一端的操作,很显然移动到另一端的最短路径肯定是最初那个点到这个点的时间更短,也就是说我们最多只需要使用一次这个操作就可以了,使用两次加长了时间。先初始化dist[]为最大值,将起点放入队列,然后起点可以往两边走,求出到达那两个点的最短路径,如果他的最短路径进行了更新,则需要将他放入队列,因为到达这个点的最短路变短,那么与他相连的点的路径也有可能会变化,出队结束后就能求出最短路啦。
2024-12-07 20:00:43
518
原创 求有限制边的最短路——Bellman_ford
Bellman_ford作为求最短路的算法之一,主要通过n次的迭代来更新每一条边,时间复杂是O(nm),这里的n次是有实际意义的。例如此题限制走的边数为k,就可以通过k次迭代来更新每一条边,超过k次更新过的说明走过的边数一定大于k,则不符。bellman_ford也可以用来求负权回路,即当第n次迭代时有进行更新,说明走的边数大于n,则一定存在负权回路,但时间复杂度较高,可以用spfa求负权回路(添加一个经过边数的变量k,当k大于n说明步数大于n,则存在负环)。
2024-12-03 16:24:41
919
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅