问题描述
我的任务是在具有Q
个节点的生成树图中高效处理N
个查询。
每个查询都涉及到我需要处理的一条边,我应该输出图中删除该边后剩余的两个分量的大小。
我当前的想法是从该边缘连接的两个节点启动DFS,确保DFS永不跨越边缘本身。这样,我就能在O(N)
的时间内找到两个组件的大小,总复杂度为O(Q * N)
。
但是,我认为可以进行某种预处理来进一步降低解决方案的时间复杂度,但我只是想不出那是什么。有人可以指出我正确的方向吗?
解决方法
好吧,这是我刚想出的一种策略:
首先,找到一个度数完全为1
(保证在生成树图中存在的节点;它被称为“叶”)。从该节点运行DFS,并保留一个变量count
,该变量表示到目前为止已被访问的节点数。每次遍历一条边缘时,由于树的特殊属性(具体而言,之间只有一条路径,因此,删除该边缘形成的两个分量的大小必须等于count
和N - count
)任何一对节点)。这样就产生了具有O(N)
预处理和O(1)
查询应答的算法,总时间复杂度为O(N + Q)
。