A5089 | 最短路
时间限制2s
内存限制128MB
通过 / 提交0/0
题目描述
$Alice$ 最近学习了图论中的最短路算法,现在她遇到了一个关于树操作的有趣问题。$Bob$ 拥有一棵包含 $n$ 个节点的树结构,其中每条边的长度都是 $1$。$Bob$ 可以对这棵树执行以下两种操作:
- 操作 1 x(节点删除操作):删除树中的节点 $x$ ,保证结点 $x$ 之前没有被删除 。假设与 $x$ 直接相连的节点集合为 $\{v_1, v_2, \dots, v_k\}$,那么在删除 $x$ 后,系统会自动在这些相邻节点之间两两建立新的边,且每条新边的长度仍保持为 $1$。
- 操作 2 x y(最短路径查询):查询节点 $x$ 和 $y$ 之间的最短路径长度(保证在执行查询时 $x$ 和 $y$ 都未被删除)。
现在,Bob 将要依次执行 $m$ 次上述操作,Alice 需要设计一个高效的算法来处理这些操作并正确回答所有的查询请求。你能帮助她解决这个具有挑战性的问题吗?
- 操作 1 x(节点删除操作):删除树中的节点 $x$ ,保证结点 $x$ 之前没有被删除 。假设与 $x$ 直接相连的节点集合为 $\{v_1, v_2, \dots, v_k\}$,那么在删除 $x$ 后,系统会自动在这些相邻节点之间两两建立新的边,且每条新边的长度仍保持为 $1$。
- 操作 2 x y(最短路径查询):查询节点 $x$ 和 $y$ 之间的最短路径长度(保证在执行查询时 $x$ 和 $y$ 都未被删除)。
现在,Bob 将要依次执行 $m$ 次上述操作,Alice 需要设计一个高效的算法来处理这些操作并正确回答所有的查询请求。你能帮助她解决这个具有挑战性的问题吗?
输入格式
第一行包含两个整数 $n$ 和 $m$,分别表示初始树的结点数和操作次数。
接下来 $n-1$ 行,每行包含两个整数 $u_i$ 和 $v_i$,表示初始树上结点 $u_i$ 和 $v_i$ 之间存在一条边。
最后 $m$ 行,每行描述一个操作:
- 若输入为
- 若输入为
接下来 $n-1$ 行,每行包含两个整数 $u_i$ 和 $v_i$,表示初始树上结点 $u_i$ 和 $v_i$ 之间存在一条边。
最后 $m$ 行,每行描述一个操作:
- 若输入为
1 x,表示删除结点 $x$(保证 $x$ 未被删除过)。- 若输入为
2 x y,表示查询结点 $x$ 和 $y$ 之间的最短路径长度(保证 $x$ 和 $y$ 未被删除)。输出格式
对于每个
2 x y 操作,输出一行一个整数,表示 $x$ 和 $y$ 之间的最短路径长度。输入输出样例
输入 #1
5 4 2 1 2 3 1 4 1 5 2 1 2 1 1 1 2 2 3 4
输出 #1
1 1
输入 #2
10 30 2 1 3 2 4 3 5 3 6 5 7 3 8 5 9 6 10 5 2 9 10 2 5 1 2 4 4 2 8 4 2 5 8 2 6 5 2 10 5 2 1 2 2 7 4 2 8 7 2 4 10 2 1 5 2 10 3 2 9 3 2 10 8 2 7 4 2 2 9 2 7 1 2 8 10 2 1 3 2 6 4 2 5 3 2 4 6 2 7 8 2 3 5 2 1 8 2 7 3 2 5 5 2 3 5 2 3 2
输出 #2
3 3 0 3 1 1 1 1 2 3 3 3 2 3 2 2 4 3 2 2 3 1 3 3 1 4 1 0 1 1
约束条件
- $1 \leq n, m\leq 5\times 10^5$
- $1 \leq u_i, v_i, x, y \leq n$
- 保证初始输入是一棵树
- 保证删除操作不会重复删除同一个结点
- $1 \leq n, m\leq 5\times 10^5$
- $1 \leq u_i, v_i, x, y \leq n$
- 保证初始输入是一棵树
- 保证删除操作不会重复删除同一个结点
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?