10.4 国庆 环形dp与基环树笔记
1.知识点
环形dp
环形 dp 的概念
• 环形dp与基环树在许多环形结构的问题中,我们可以在环中从某个位置把环断开,把这个环变成线性的,然后进行
• 把能通过上述操作解决的环形问题称作 "可拆解的环形问题" 。
环形 dp 的两种策略
• 第一次在任意位置把环断开成链,按照线性问题求解;第二次通过适当的条件和赋值,保证计算出的状态等价于把断开的位置强制相连。
• 把环断成链,然后复制一倍在末尾
基环树
•
• 把这种
• 如果不保证连通,那么
外向树
•
•
基环树的直径
• 基环树中最长的简单路径被称为基环树的最长链,其长度被称为基环树的直径。
基环树找环
• 自己一个很神奇的方法:
- 预处理出每个点的
- 从某个点开始,一直往它的
走,边走边做 标记,当走到一个已经访问过的节点时,便找到了环。
Code:
int find(int u)//从 u 点开始找环
{
vis[u] = true;
node = u;
while (!vis[fa[node]])
{
node = fa[node];
vis[node] = true;
}
return node;
//node 为环的一点
}
T1
•
• 每到达一个点时,把这个点的编号记录下来,这样最后会组成一个长度为
• 对于
• 对于
Solution
• 数据范围提示了做法 /kk。
•
• 题目要求字典序最小,于是用
• 而对于另外的
• 手玩一下基环树的样例可以发现,一定有一条边是无法经过的,我们枚举这条边,然后
• ps:加强版无法通过,可能是
T2
咕咕咕。
T3
•
- 每个人与他讨厌的人不能一同选择
- 选出这若干个人的价值和最大
• 求出价值和。
•
Solution
• 把每个人都向他讨厌的人连一条边,那便是
• 先找到环,并把它断开,然后我们跑两遍树形
•
T4
•
- 每个物品与它限制的物品不能一起被取出
- 选出的物品尽量多
• 求出能选择的最多数量
•
Solution
• 与上题类似。
T5
• 题意自己看。/bx
Solution
• 一个简单的环形
• 我们定义
• 那么有方程
f[i][j][0]=max(f[i - 1][j][0],f[i - 1][j][1])
f[i][j][1]=max(f[i - 1][j - 1][0], f[i - 1][j - 1][1] + u[i])
• 因为是环形,先跑一遍
T6
•
• 编号为
• 求出哪两座仓库之间运送货物需要的代价最大。
Solution
• 由于是环形,所以用断环为链的方法,把这个环断开,然后进行线性
•
• 首先推出式子
• 当
• 这一步用单调队列优化,于是时间复杂度变成
Code:
for (int i = 2; i <= (n << 1); i ++ )
{
while (q.size() && q.front() < i - m) q.pop_front();
ans = max(ans, s[q.front()] - q.front() + s[i] + i);
while (q.size() && s[q.back()] - q.back() < s[i] - i) q.pop_back();
q.push_back(i);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】