
最短路
C202044zxy
这个作者很懒,什么都没留下…
展开
-
[WC2016] 论战捆竹竿 && [学习笔记] 同余最短路
本来想做字符串的题,结果发现了这个坑把他填上。什么是同余最短路?同余最短路是解决这样一类问题:给你若干个数 a[i]a[i]a[i] ,每个数可以选无限次加起来,问最后的和有多少种在 mmm 的范围内,这种问题 mmm 可以开到非常大,但 a[i]a[i]a[i] 不会很大。那怎么做?是个正常人都不会去跑背包,同余最短路,顾名思义肯定要和余数有关系,我们把 a[1]a[1]a[1] 单独拎出来作为模数,设 dp[i]dp[i]dp[i] 为模 a[1]a[1]a[1] 余 iii 的最小数(是剩下的原创 2020-12-09 17:02:09 · 366 阅读 · 0 评论 -
[NOI2018] 归程
一、题目点此看题二、解法先弄清楚本题要求什么,实际上那个到111的距离就是个摆设,因为我们可以直接求dijkstra\tt dijkstradijkstra,那么问题就变成了 保留水位线大于ppp的边,uuu所在块连通性是怎样的,我们只需要把这个维护出来就行了。第一种显然的思路是可持久化并查集,太麻烦了。kruskall\tt kruskallkruskall重构树可以很好的解决这个问题,想象我们需要的边只可能是最大生成树上的边,如果我们在跑生成树的时候构建重构树,那么就具有下列性质:点代表的是原创 2020-10-27 21:11:39 · 233 阅读 · 0 评论 -
[nowcoder 2020] 移动
一、题目点此看题二、解法首先请明确两点:可以往回走!dpdpdp贪心死活想不出来的时候可以考虑下图论,思路要打开!其实这道题如果用最短路的话就比较好想,我们的目的是让每个点向相邻的点转移(这样可以兼顾回退、等待、前进),但是我们要知道时间,怎么办?我们知道时间的目的是为了确定闸门的关闭,既然不能知道具体的时间,我们就通过闸门的关闭时间段来划分时间段,夹在两个之间的就当做一个可通行的状态,通过最短路可求出到达这个状态的最小时间,状态的编号就用夹住它的前面关闭时间段的编号,状态数是O(n+m)O(n+m原创 2020-10-21 16:23:07 · 950 阅读 · 9 评论 -
[模板] 差分约束算法
一、题目点此看题二、解法首先把不等式转化成下面的形式:xu≤xv+yx_u\leq x_v+yxu≤xv+y那么就相当于vvv连向uuu一个权值为yyy的边,然后去跑最短路。实现用spfa\tt spfaspfa,需要判负环(一个点入队大于nnn次就说明有负环)#include <cstdio>#include <queue>using namespace std;const int M = 5005;int read(){ int x=0,f=1;cha原创 2020-10-03 22:00:29 · 198 阅读 · 0 评论 -
1-11G. JM的月亮神树
一、题目二、解法先跑一遍最短路,建出最短路图(由在最短路上的边构成)对于每一个点,都有一个引路人和他有边连接,这个引路人在这个点的最短路径上,每个点选出和引路人相连接的边就可以保证是最短路树,选出的边找权值最小的,权值相同找编号最小的(不能直接最小生成树哟)#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;原创 2020-08-25 16:56:51 · 250 阅读 · 0 评论 -
CF786B Legacy
一、题目点此看题二、解法原创 2020-08-24 11:27:59 · 143 阅读 · 0 评论 -
CF567E President and Roads
一、题目点此看题二、解法原创 2020-08-24 10:59:00 · 184 阅读 · 0 评论 -
CF416E President‘s Path
一、题目点此看题二、解法原创 2020-08-24 10:16:52 · 142 阅读 · 0 评论 -
CF1051F The Shortest Statement
一、题目点此看题二、解法原创 2020-08-24 10:06:23 · 124 阅读 · 0 评论 -
[JOISC 2015 Day 1]卡片占卜
一、题目点此看题二、解法可以把原来的数组表示成差分数组,那么只有A+1,A+B+1.....A+1,A+B+1.....A+1,A+B+1.....这四个位置有值,我们要把所有值给消去。把操作理解为建边,那么找出两个关键点的最短路就是消去这两个关键点,那么我们消去两对关键点就可以了,有一个特殊情况就是一个点和n+1n+1n+1相连,那么必然会剩下一个点,它只能通过这种方法消去,所以这种情况还是可以归类到上面去的。具体就是跑333边dijkdijkdijk,还有疑问可以康代码。#include &原创 2020-06-06 16:26:57 · 257 阅读 · 0 评论 -
[JOI 2017 Final]足球
一、题目点此看题二、解法把每一个位置拆成666个点:0−30-30−3分别代表球正在向上下左右四个方向滚动,444代表球在该点但是没人持球,555代表球在该点而且有人持球。下面详细讲一下建边的方法:没人持球到有人持球,召唤离当前点最近的 工具 人,这人不用考虑移动,因为一个人持球并踢开后就不可能再持球了,找这个最近的人就可以用bfsbfsbfs某个方向到无人持球,边权为000某个方向继续滚动,边权为AAA有人持球到下一个位置继续持球,边权为CCC有人持球到踢出去(状态还是在当前点),边权为原创 2020-05-30 20:55:03 · 269 阅读 · 0 评论 -
[SDOI2017]天才黑客
一、题目点此看题二、解法真的毒瘤,我 TM 搞了三个小时,调起来太 TM 爽了。言归正传,这道题很容易想到一个最短路解法,我们把每条边拆成两个点,它们之间的边权值都是原来的边权,然后对于每个点(原图),我们把入点和出点暴力连边,边权为lcplcplcp(字典树上lcalcalca的深度−1-1−1),这个做法可以拿到000分的高分,因为入点和出点相连时边数最多是m2m^2m2,然后时间复...原创 2020-01-12 10:58:48 · 746 阅读 · 0 评论