合集-图论
摘要:原题链接 题解 我们令 a出现在b前面 \(\to\) 建立一条a到b的有向边 如果有强连通分量,那么no 每张截图除了第一个人,其余人均按相对位置排序 这道题就变成了给定若干个相对位置,求是否存在可能的绝对位置 我们可以建图,作拓扑排序,一个节点能被遍历到当且仅当其所有的父节点都被遍历到 当且仅当
阅读全文
摘要:原题链接 题解 1.暴力模拟 对每条边枚举(枚举之前先对边排序),然后对除去枚举边之外的边做并查集 code1: #include<bits/stdc++.h> using namespace std; struct unit { int x,y; }edge[5005]; bool cmp(uni
阅读全文
摘要:原题链接 题解 一个节点的答案一定是最大父节点+1 code #include<bits/stdc++.h> using namespace std; int ans[100005]={0}; int in[100005]={0}; vector<int> G[100005]; struct uni
阅读全文
摘要:原题链接 题解 好抽象啊!!! 大概思路就是把强连通分量看作一个点,然后在此基础上找入度为零的点 code #include<bits/stdc++.h> using namespace std; vector<int> G[205]; int in[205]={0};//代表强连通分量的入度 in
阅读全文
摘要:原题链接 题解,请看题解区第一篇,看一遍就会了 code #include<bits/stdc++.h> using namespace std; int fa[400005]={0}; int finds(int now) { return fa[now]=(fa[now]==now?now:fi
阅读全文
摘要:原题链接 题解 先说结论 对单个图做深度搜索树,对于树的根节点,它要能是割点当且仅当她有至少两个不互通的儿子节点 对于树的非叶子非根节点,它要能是割点当且仅当存在儿子节点能去的时间戳最小的节点不小于当前节点的深度搜索序 对于叶子节点, 不可能成为割点 code #include<bits/stdc+
阅读全文
摘要:原题链接 题解 唯一能解释的图片,黄色代表会执行入栈操作的点 code #include<bits/stdc++.h> using namespace std; int vis[500005]={0}; int low[500005]={0}; stack<int> q; vector<int> a
阅读全文
摘要:原题链接 题解 和点双连通分量不同在于 点双联通分量:分量内任意两点之间至少有两条独立路径可走,两条路径所经过的点除了起点和终点都不同 边双连通分量:分量内任意两点之间至少有两条独立路径可走,两条路径所经过的边都不同(包括重边) 用这个图依然可以解释 code #include<bits/stdc+
阅读全文
摘要:原题链接 题解 首先,题目确保这是一个图 那么我们进行缩点,把边双连通分量的点缩点,然后统计叶子节点,也就是连接数为1的节点 要注意有重边的存在,那么我是怎么处理的呢?把两点之间的直接边只能出现一次,那我就作二维数组统计 code #include<bits/stdc++.h> using name
阅读全文
摘要:原题链接 题解 非常抽象的缩点 大概思路:搜索缩点成有向图,求该点的入度和出度,最后答案一定是 \(max(in,out)\) 总之很抽象 code #define ll long long #include<bits/stdc++.h> using namespace std; inline vo
阅读全文
摘要:原题链接 题解 核心技巧:两次搜索 第一次搜索: 搜索出 \(f[now][i]\) 以 \(now\) 为根节点的子树且距离根节点恰好为 \(i\) 的节点的个数 搜索完了之后,把范围 \(k\) 以内的累加 第二次搜索: 由于整棵树的根节点的 \(f\) 等于整棵树里距离不大于 \(k\) 的节
阅读全文
摘要:原题链接 题解 二分图匹配,总的来说就是如果我的位子没人霸占,那我就坐,如果没人霸占,那我尝试着让他滚蛋 如果一个位子经历过两次滚蛋,说明别人确实没位子坐了,人家确实需要这个位子,那我就换一个位子 code #include<bits/stdc++.h> using namespace std; i
阅读全文
摘要:原题链接 题解 思维转换,想象井里的水都来自山上,并把山看成一个点,那么这道题就变成了最小生成树 简证最小生成树原理: 按边权排序,然后遍历,如果这条边的两个点之前每连过,那么就连上,因为这就是这两个点所在集合之间的最短路径了,不然这条边没必要加,因为已经联通了 算是一种贪心? code #incl
阅读全文
摘要:原题链接 题解 最小生成树和最短路不一样的兄弟 code #include<bits/stdc++.h> using namespace std; int fa[306]={0}; int finds(int now){return (fa[now]==now?now:finds(fa[now]))
阅读全文
摘要:原题链接 题解1: 按边权从大到小排序,如果这条边的两个点没确定关系,那么把他们设为敌人 这样,就成了一棵棵最大生成树(因为有的罪犯之间没有怨气) 由敌人的敌人是朋友可以得出,如果两个点在同一棵树,且距离为偶数,那么代表他们之间互为朋友 code1 #include<bits/stdc++.h> u
阅读全文
摘要:原题链接 题解1:朴素广搜 注意细节 code1 #include<bits/stdc++.h> using namespace std; int poi[4]={-3,1,-1,3}; int main() { string s; cin>>s; queue<string> q; map<stri
阅读全文
摘要:原题链接 题解 把奶牛看成点,赠送列表关系看成有向边,这样这道题就成了对强连通分量缩点,然后找出这个新图中入度为零的点有几个,出度为零的点有几个 code #include<bits/stdc++.h> using namespace std; vector<int> G[105]; int len
阅读全文
摘要:原题链接 题解 抽象化 抽象成点和边,对于抹除一个点,判断整个图是否联通 等价于建立一个点(被抹除点的前一个点),判断这个点与周围点相连后,累积合并次数是否等于点数减一 code #define ll long long #include<bits/stdc++.h> using namespace
阅读全文
摘要:原题链接 题解,终于有一道题一遍过了 强连通分量缩点加本题个性化判断 code #include<bits/stdc++.h> using namespace std; vector<int> G[10005]; int order[10005]={0},low[10005]={0},len=0;
阅读全文
摘要:原题链接 题解 这种让来让去让我想到了二分图!! 注意细节!!剩余的就是模拟了 code #include<bits/stdc++.h> using namespace std; int stu[55],gohome[55],know[55][55]; int n; int belong[55]={
阅读全文
摘要:原题链接 题解 发誓以后除了stl内置,其他时候结构体绝对不内置比较函数 code #define ll long long #include<bits/stdc++.h> using namespace std; ll in_q[3005]={0}; ll h[3005]={0}; ll vis[
阅读全文
摘要:原题链接 题解 原题可以理解为 \(\to\) 找出含有最小边权的边双连通分量,然后找出那个边对应的两个节点的第二条路 本题我学会了: 1.代码命名风格要含义清晰,不然很容易搞混,包括变量,自定义函数 2.建边的时候尽量用链表式,因为dalao都在用,看题解方便一点 code #define ll
阅读全文
摘要:原题链接 题解 深搜带上 \(sum_a\) ,然后把经过的 \(sum_b\) 放入栈里, 二分查找 code #define ll long long #include<bits/stdc++.h> using namespace std; inline void read(ll &x) { x
阅读全文
摘要:原题链接 题解 太巧妙了!! 原题等效于该分层图,然后广搜 本题中我用了另一种方法建边,因为清空太麻烦了 code #include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.t
阅读全文
摘要:原题链接 题解 1.任意两条边在且仅在一条链上 2.一定存在一条链使得其包含边权为0,1的边,这个时候我们要让2不在01所在的链上,即如下情况: 此时01所在链答案为2,02所在链答案为一 3.如果树退化成了链,那么不管怎么构造都一样 由此得出,找出这样 的 T 型节点,即含有三条边的节点,然后在它
阅读全文
摘要:原题链接 题解 \(a\to b,b\to c,a\to c\) 等价于 \(a\to b\to c\) \(a\to z,b\to z\) 也可以等价于 \(a\to b\to z\) 花费不变 所以是并查集,然后累积建边数量 如果 \(finds(a)==finda(z)\) 代表 \(a\)
阅读全文
摘要:原题链接 题解 把两个含有相同字符的字符串放进一个集合里,这让我想到了并查集 这里是线性并集,遍历字符串,对于字符串中出现的字符的集合并到自己身上来 code #include<bits/stdc++.h> using namespace std; int occ[30]={0}; int fa[2
阅读全文
摘要:原题链接 题解 做两遍dfs,就能从树中求得图的效果了 第一遍,令 \(f[i]\) 为以 \(i\) 为根的子树(包括自身)的 \(maxans\) 则 \(f[i]\) 的初值为 \( \begin{cases} 1,a[i]=1 \\ -1,a[i]=0 \end{cases} \) \(f[
阅读全文
摘要:原题链接 WARNING!!! 使用map代替数组不再可靠,因为map的插入查找修改复杂度均为 \(O(logn)\) ,即使unorder_map也不行!!! 题解 我们发现,当一个节点的深度之和已知时(这里认为是根节点),其相邻节点的深度之和也可通过某种方程转移而得,有人称这种方法为换根DP 具
阅读全文
摘要:原题链接 题解 1.\(A<B\) \(\to\) 建立一条A向B的边 2.由于数据范围小,所以可以输入一次进行一次拓扑遍历 3.如果存在矛盾,说明存在环 4.对于拓扑排序进行层次标记,如果最大层等于n,代表每个字母层次分明,有先后次序 code #include<bits/stdc++.h> us
阅读全文
摘要:原题链接 题解 拓扑排序,层级标记,如果层级等于n,代表层次分明 code #include<bits/stdc++.h> using namespace std; vector<int> G[500005]; int in[500005]={0}; struct node { int id,lay
阅读全文
摘要:原题链接 题解 请看code code #include<bits/stdc++.h> #define ll long long using namespace std; struct { ll to, val, head, times = 0; } edge[200005]; ll out[100
阅读全文
摘要:原题链接 题解 1.具体去考虑每个集合所包含的元素及其大小个数是非常繁琐的,所以我们考虑每个元素对答案的贡献 2. 令 \(f[now]\) 代表以 \(now\) 为根节点的答案 \(sizes[now]\) 代表以 \(now\) 为根节点所包含集合的个数 更新过程如下: \(f[now]+=f
阅读全文
摘要:原题链接 题解 1.虫洞等价于建立负权边 2.回到过去等价于存在负权环 这里就相当于检测是否存在负权环,怎么判定呢?广搜,对于任意不含有负权环的,任意两点间的点数一定小于n 如果存在负权环,那么搜索会一直沿着这个环进行下去,其路径的点数会大于n code #include<bits/stdc++.h
阅读全文
摘要:原题链接 题解 1.每个城市选择一个与它最近的城市 2.如果三个或以上的城市申请修建的公路成环。如下图,A 申请修建公路 AB,B 申请修建公路 BC,C 申请修建公路 CA。则政府将否决其中最短的一条公路的修建申请; 但是这条不成立,请看这条题解 或者下图 由此得出这题就是最小生成树,虽略有不同,
阅读全文
摘要:原题链接 题解 1.最短路径一定可以表示成经过若干端点的线段,所以我们把端点单独提出来,这样就变成了计算几何形式的最短路 2.如果两个端点能相连,代表他们之间没有墙阻挡 code #include<bits/stdc++.h> using namespace std; int n; struct {
阅读全文
摘要:原题链接 题解 1.该题等价于构建一颗k叉树,每个叶子节点都有一个权值 \(leaf_i\) ,树的权值为 \(\sum_{1}^{n}leaf_i\) ,在使树的权值尽可能小的情况下,使最深的叶子节点的深度也尽可能小,即使数的高度尽可能小 这个叫做哈夫曼树 2.构建过程如下:每次从队列中取出 \(
阅读全文
摘要:原题链接 题解 1.建议去B站上看看动画演示,你就明白怎么回事了 2.如何用代码实现呢?看完你就明白了 code #include<bits/stdc++.h> using namespace std; int num=0; int tree[3000006][75]={0}; int cnt[30
阅读全文
摘要:原题链接 题解 1.由于我刚刚才学字典树,所以我会告诉你这就类似字典树,对字符串终点节点加一,然后搜索统计最大前缀和 code #include<bits/stdc++.h> using namespace std; string s; int tree[2000005][65]={0}; int
阅读全文
摘要:原题链接 题解 1.修改树上某一段路径 ,最后问你单个点的最大值,很想区间修改,单点查询,且只查询一遍,所以我们往前缀和方向靠 2.一个节点只有一个父亲,所以从底到根的路径是一条链,我们可以在这里应用前缀和,标记策略为令 \(tree[now]++\) 代表 \(now\) 节点到根节点这条链上所有
阅读全文
摘要:原题链接 题解 1.这k个城市一定是连成一团在中间的 2.把树展开,变成散发图,剩下的n-k个城市一定在最边缘的位置 3.拓扑排序 dalao's blog code #include<bits/stdc++.h> using namespace std; vector<int> G[100005]
阅读全文
摘要:原题链接 题解 树上只有两种颜色,我们把每种颜色的连通块记录下来,只有当路径两端的点属于同一连通块且颜色与朋友喜欢的不同时输出0 code #include<bits/stdc++.h> using namespace std; char s[100005]; int fa[100005]; int
阅读全文
摘要:原题链接 题解 dalao‘s blog 我自己的认识请看代码区 code #include<bits/stdc++.h> using namespace std; int n,Q,root,mod; int bigson[100005];//和自己在同一条链上的儿子节点 vector<int> G
阅读全文
摘要:原题链接 题解 我一直苦苦思考为什么要建边,现在我明白了,如果令 \(x_i\) 代表离源点的最短路径长度的话,建边之后,\(x_i-x_j<=y_k\) 一定成立 只有当出现负环的时候说明条件出现了矛盾 太神了 为什么负环会出现矛盾? 简单认识一下,如果出现负环,代表每到一个点就至少有一条边的约束
阅读全文
摘要:原题链接 题解 1.搜索路径不等于欧拉路径,优先搜索字典序小的点,是为了找出终点,一个终点找到后,找下一个终点,所以不能边找边输出,要把遍历完的再放到栈里 code #include<bits/stdc++.h> using namespace std; int vis[100005]={0}; v
阅读全文
摘要:原题链接 题解 本质上是做题,所以观察题目数据,很小,直接暴力遍历所有点走单源最短路 code #include<bits/stdc++.h> using namespace std; struct node { int x,val; bool operator<(const node&b) con
阅读全文
摘要:原题链接 题解 1.设 \(f(i)\) 为 \([0,i]\) 区间内该有多少个数属于整数集 \(Z\) 则对于每一对输入的 \(x,y,c\) 都有 \(f[y]-f[x-1]>=c\) 而且 \(0<=f[i]-f[i-1]<=1\) 差分约束由此得来 又因为下标从零开始,而且我们需要建立超级
阅读全文
摘要:原题链接 题解 只需要存在两个叶子节点之间距离等于d就好了,于是我们构造一条链,令节点一为滑动变阻器,则根据d改变与节点n的距离即可 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while
阅读全文
摘要:原题链接 题解 看清楚题目,是三个人都坐在同一辆校车!! code #include<bits/stdc++.h> #define ll long long using namespace std; vector<ll> G[200005]; ll depth[200005]={0}; void d
阅读全文
摘要:原题链接 题解 easy.ver::只能朝一个方向走,还剩奇数个格子时先手获胜 medium.ver: 令 \(u_i\) 为根节点,这样就只能朝子节点的方向走,设 \(dp[now]\) 为当以now为根的树,且now节点已经有一颗棋(其子节点均还没有)时,先手必胜1还是必败0,状态转移方程:\(
阅读全文
摘要:原题链接 题解 1.已知如果两个点之间有两条边不重合的路径,那么这两个点就在一个边强连通分量里,所以我们可以把处于同一个边强连通分量的点缩起来 在这里,我忘记了怎么求边强连通分量,所以我再提醒一下自己 已知树结构是不存在强连通分量的,它的特性是深度大的节点只有一条回到深度小的节点的边,所以我们深度搜
阅读全文
摘要:原题链接 题解 真的bt啊 由于m没有限制所有测试用例的总和,所以m可以近似看为1e9,也就是说,除了输入以外,不能有任何对m的处理(常数乘上1e9) 考虑菊花图,任意两点之间最多只有一个陌生点,而且 \(m\lt n\) 所以找出那个没有出现过的中间点,作为菊花图的中心 md!!构造题!! cod
阅读全文
摘要:原题链接 题解 观察一个二分图会发现 同一组的节点不直接相连 二分图能够建立的最多的边等于 \(n*m\) code #include<bits/stdc++.h> using namespace std; #define ll long long vector<ll> G[100005]; ll
阅读全文
摘要:原题链接 题解 题意提醒: 这里的时间段要抽象成点,比如 \([1,1] , [2,2]\) 实际上是相连的!! 1.朴素想法,每头牛要么值班要么不值班, 搜索遍历所有情况 \(O(2^n)\) 2.稍作修改,如果一头牛值班,那么在它值班结束时间之前值班的牛的数量一定是最优的,\(o(nT)\) 3
阅读全文
摘要:原题链接 题解 由于选择每一条路径的概率是一样的,所以我们统计出所有路径的条数,和长度之和,然后除一下就行了,除法求模等价于乘模数下的逆元 code #include<bits/stdc++.h> using namespace std; #define ll long long const ll
阅读全文
摘要:原题链接 题解 有点像拓扑排序 拓扑排序怎么做来着?首先找老祖节点对不对?老祖节点有什么特性? 入度为零 而在无向图中,我们把叶子节点看成老祖节点,它们有什么特性? 连接的边只有一条 code #include<bits/stdc++.h> using namespace std; vector<i
阅读全文
摘要:原题链接 题解 由易到难,先不考虑交替的事情,既然要尽量少的涂色,那么我最少要涂几条颜色的边?(由于图不一定联通,这里先考虑连通图的情况) 如果一条边处于一个环内,那么这个边就可以不涂色。 所以只要有环我就可以选择一条边不涂色,那么到最后,涂色的边构成一棵树 接下来考虑这颗树能否实现红蓝交替 要满足
阅读全文
摘要:原题链接 开始 敲代码前问问自己:如何证明你的算法的正确性? 启发 我们一开始在节点1,假如有abcd四条边,且我们已知 从每条边出发到达终点的最短距离 \(a<b<c<d\) 且 \(d[1]=3\) 请问我们要封 节点1 的哪条边? 答案显然是abc 那么好接下来我们走边d,假设到达了节点3,我
阅读全文
摘要:原题链接 题解 贪心,我管这种叫做策略贪心,即按照某种顺序或者角度去贪心可以得到最优解 既然题目要求任意两点间最短路最小的同时,价格也最小,那么我们就按长度为第一关键字,花费为第二关键字排序。然后遍历所有边看看这条边能否使用 遍历过程的策略: 如果这条边加入后,这条边两端的节点之间的距离不变。 如果
阅读全文
摘要:原题链接 一步一步来 1.假设D为1,你要怎么求? 每个点乘地铁的时间是唯一的,也就是说,如果我一开始先走一段路到A点再坐地铁,等价于我直接坐地铁到A点,下地铁的瞬间再次上车。 所以最优路径一定可以是先从起点乘地铁到某个点,然后再一直走路到终点 因此我们可以遍历 \(S\) 的每个点,求出在该点下车
阅读全文
摘要:原题链接 题解 分层图,太奥妙了 每层图都是一样的 \(d=0\) 的边建的图, \(d=1\) 就像梯子,可以去上一层走,总共有三层 code #include<bits/stdc++.h> using namespace std; #define ll long long inline void
阅读全文
摘要:原题链接 大概思路 我们已知一组不等式的解可以通过建边然后求最短路/最长路来得出 而这里要求 \(D_n-D_1\) 的最大值,所以我们要求最短路。 补充 为什么要求最短路? 对于任何一组不等式,我们都可以写成 \(a_i-b_i \leq c_i\) 建边含义 假设 \(D_n-D_1\) 有最大
阅读全文
摘要:原题链接 题解 请仔细读题!!! 如果1号工人需要提供原材料,那么代表 \(a_i \to 1\) 存在一条长度为 \(L_i\) 的路径(可以重复走) 由于重复走不会改变路径长度的奇偶性,所以一定存在一条奇偶性相同,且长度小于 \(L_i\) 的路径,所以只要求从点1出发到各个点奇偶最短路即可 c
阅读全文
摘要:原题链接 题解 贪心走最小的点,由于每个点都有偶数条边,所以能进入就一定能出去 code #include<bits/stdc++.h> using namespace std; struct node { int to,id; }; vector<node> G[505]; int late[50
阅读全文
摘要:原题链接 题解 对于一组相切的圆来说,其中一个圆变大,其相邻的圆变小,然后相邻的相邻的圆变大...而要让总半径和变小,一定得是总的变小的圆更多 实施 先判断一组圆能不能发生变化,然后再累积变大和变小的圆个数 code #include<bits/stdc++.h> using namespace s
阅读全文
摘要:原题链接 题解 我一开始想遍历每一个点,然后求出能和它配对的点的权值,但是参考菊花图,这样的速度太慢,所以考虑用一个点表示多个配对,于是发现每个点都可以作为配对的中间点 code #include<bits/stdc++.h> using namespace std; const int mod=1
阅读全文
摘要:原题链接 题解 1.注意,路的数量总和不超过 \(2·10^5\),所以如果路没有时间限制,和普通最短路没有区别 2.由于可以原地等待,所以早到一个点一定比晚到更优 3.每到一个点,遍历所有邻边,如果这条边能在之后激活,那么看看经过这条边到达对面点的时间是否最少 code #include<bits
阅读全文
摘要:原题链接 题解 1.假设有一个以标记点 \(c\) 为根的子树,且子树内没有其他标记点,易得该子树内所有点的 \(f\leq f(c)\),所以我们可以把该子树内的非标记点全部删掉 2.完成步骤1之后,图就变成了所有叶子节点均为标记点的树 3.题目等价于求该树内,最小的点到边界的最大值,也就是求树的
阅读全文
摘要:原题链接 题解 在一个章节更新过后,更新其周围章节的首次阅读时间,如果周围章节在其后面,时间不变,如果在其前面,时间加一 当一个章节的前置章节都更新完之后再更新其周围章节 code #include<bits/stdc++.h> #define ll long long using namespac
阅读全文
摘要:原题链接 题解 二分图,分为两类,一类是指向,一类是被指向 在这里,只需要建立情人之间的边就行,因为找情人能否成功 code #include<bits/stdc++.h> #define ll long long using namespace std; vector<int> G[10000];
阅读全文
摘要:原题链接 题解 首先,考虑如何分配卫星电话使得 \(D\) 最小是比较困难的,所以我们考虑怎样的 D 可以使得卫星电话个数不小于联通块个数 由于 D 越小,联通块个数也就越小,所以具有单调性,考虑二分 优化: 最后的答案,一定是所有连通块内部,距离最长的树边(即失去该边之后,联通块变得不连通),由此
阅读全文
摘要:原题链接 题解 一步一步来,当 \(k=2\) 的时候,怎么分? 当 \(k=2\) 时,两个点集之间的距离等于两个点集中各取一个点之间的最小距离,我们联想到最小生成树的建立过程,按边权从小到大依次加入,如果两个点所属集合不同便合并 因此,当 \(k=2\) 的时候,答案是最小生成树的最后一个合并边
阅读全文
摘要:原题链接 题解 缩点+差分约束,求最小值故跑最长路 无解的情况:存在正权环,由于是有向图,所以环上的元素在一个强连通分量内,判断强连通分量内存不存在有正权值的边,然后缩点,拓扑跑一圈 缩点时要一个超级源点就可以只dfs一次了 code #include <bits/stdc++.h> using n
阅读全文
摘要:原题链接 题解 暴力方法: 遍历每个节点,遍历每个节点的子节点,遍历每个子节点的子节点,看看子子节点是否是节点的子节点,时间复杂度 \(O(nm^2)\) 优化 考虑无向边建边的时候建成有向边,且两个点建边时,度数小的指向度数大的,如果度数相等,编号小的指向编号大的(其实这一步是为了避免重复计数)(
阅读全文
摘要:原题链接 题解 朴素做法: 每次询问,二分最小边,然后bfs遍历查看是否能到达,时间复杂度 \(O(q\cdot logn\cdot m )\) 优化: 如果答案里的最小边是 \(k\) ,那么代表所有边权不小于 \(k\) 的边都可以使用,因此可以直接从大到小加入边,直至起点与终点连接 时间复杂度
阅读全文
摘要:原题链接 题解 往无向图中添加至少几条边,使得图中包含奇数环? 注意是要添加少边,而不是使环小 讨论 1.0条 当且仅当原图中存在奇环,方案数为0 用bfs染色判断,即对于一个环,bfs一定会绕一圈该环,然后黑白染色判断奇偶即可 2.一条 当且仅当存在一连通图大小大于等于3 对于该连通图内,对方案数
阅读全文
摘要:原题链接 获取题意 1.只能传送一次。 2.走树边没有限制。 3.只能传送至非相邻节点 4.路径一定是如下形式: \(S\to x \to T\) 其中要么 \(x\to T\) 传送要么 \(S\to x\) 传送 \(S\to x \to y \to T\) 其中 \(x\to y\) 传送 \
阅读全文
摘要:原题链接 分析 很逆天的一道题 设 \(dp[i][j]\) 为到达第 \(i\) 个点的时刻 \(t\) 且满足 \(t\mod k=j\) 的最小 \(t\) 则有答案为 \(dp[n][0]\) 更新也很简单,设当前点为 \(u\),当前时间为 \(t\) 需要遍历的下一个点 \(v\),则有
阅读全文
摘要:原题链接 题意 对于有相同颜色传送门的城市 \(i,j\),可以花 \(|i-j|\) 的代价从 \(i\to j\) 或 \(j \to i\) 问从城市 \(x\to y\) 的最小代价,或者报告无法到达 分析 对于无法到达的情况,很简单,用并查集维护即可 而对于可以到达的情况,我们发现,两座城
阅读全文

浙公网安备 33010602011771号