P4949 最短距离
题目描述
给出一个 N 个点 N 条边的无向连通图。
你需要支持两种操作:
- 修改 第 x 条边的长度为 y ;
- 查询 点 x 到点 y 的最短距离。
共有 M 次操作。
输入输出格式
输入格式:
输入共 N + M + 1 行:
第 1 行,包含 2 个正整数 N,M,表示点数即边数,操作次数。
第 2 行到第 N + 1 行,每行包含 3 个正整数 x,y,z,表示 x 与 y 间有一条长度 为 z 的边。
第 N + 2 到 N + M + 1 行,每行包含 3 个正整数 opt,x,y,表示操作种类,操作的参数(含义见【题目描述】)。
输出格式:
对于每次操作 2 输出查询的结果。
输入输出样例
输入样例#1:
1 | 4 5 |
输出样例#1:
1 | 13 |
说明
题解
这道题思维难度还行,代码实现难度略高。
首先我们需要实现支持以下功能的函数:
- O(1)查询每条边代表的点,断边为0即可
- O(1)维护环上边权总和
- O(1)查询一条边是否为割边。
- O(1)查询邻接表中每个编号所对应的读入顺序
- O(1)查询一个点所属的环子树
接下来任选一条边断开,将这颗树用HPD维护。
当给出一个修改操作时
- 如果是树边,直接HPD维护,
- 如果是环边,O(1)在数组中修改这条环边边权,O(1)更新环上边权总和,O(nlogn)更新HPD这条边对应点点权
对于查询操作
- 如果两点属于同一环子树,直接查询两点距离,
- 如果属于不同子树,需要考虑环上另一条路径长度(O(1)查询即可),复杂度同样
上一下一遍过的Code(NOIP要是我代码能力发挥出写这题的一半就不会炸这么惨。。。):
1 |
|