有没有一种有效的方法在删除边后在生成树图中查找组件的大小?

问题描述

我的任务是在具有Q个节点的生成树图中高效处理N个查询。

每个查询都涉及到我需要处理的一条边,我应该输出图中删除该边后剩余的两个分量的大小。

我当前的想法是从该边缘连接的两个节点启动DFS,确保DFS永不跨越边缘本身。这样,我就能在O(N)的时间内找到两个组件的大小,总复杂度为O(Q * N)

但是,我认为可以进行某种预处理来进一步降低解决方案的时间复杂度,但我只是想不出那是什么。有人可以指出我正确的方向吗?

解决方法

好吧,这是我刚想出的一种策略:

首先,找到一个度数完全为1(保证在生成树图中存在的节点;它被称为“叶”)。从该节点运行DFS,并保留一个变量count,该变量表示到目前为止已被访问的节点数。每次遍历一条边缘时,由于树的特殊属性(具体而言,之间只有一条路径,因此,删除该边缘形成的两个分量的大小必须等于countN - count)任何一对节点)。这样就产生了具有O(N)预处理和O(1)查询应答的算法,总时间复杂度为O(N + Q)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...