删除边后,是不是有一种有效的方法可以在生成树图中查找组件的大小?
Posted
技术标签:
【中文标题】删除边后,是不是有一种有效的方法可以在生成树图中查找组件的大小?【英文标题】:Is there an efficient way to find the sizes of components in a spanning tree graph after removing an edge?删除边后,是否有一种有效的方法可以在生成树图中查找组件的大小? 【发布时间】:2020-09-12 16:50:57 【问题描述】:我的任务是在具有N
节点的生成树图中有效地处理Q
查询。
每个查询都引用我需要处理的一条边,并且我应该输出图中删除该边后剩余的两个组件中的每一个的大小。
我目前的想法是从由该边缘连接的两个节点启动 DFS,确保 DFS 永远不会遍历边缘本身。这样,我将能够在O(N)
时间内找到两个组件的大小,总复杂度为O(Q * N)
。
但是,我认为可以进行某种预处理以进一步降低解决方案的时间复杂度,但我就是想不出那可能是什么。有人可以指出我正确的方向吗?
【问题讨论】:
【参考方案1】:嗯,这是我刚刚想出的一个策略:
首先,找到度数正好为1
的任何节点(保证存在于生成树图中;它被称为“叶”)。从该节点运行 DFS,保留一个变量 count
,表示到目前为止已访问的节点数。每次遍历一条边时,由于树的特殊属性,通过删除该边形成的两个组件的大小必须等于 count
和 N - count
(具体来说,任何一对节点之间只有一条路径)。这会产生一个具有O(N)
预处理和O(1)
查询回答的算法,总时间复杂度为O(N + Q)
。
【讨论】:
工作正常。事实上,你可以在任何你喜欢的地方扎根树。以上是关于删除边后,是不是有一种有效的方法可以在生成树图中查找组件的大小?的主要内容,如果未能解决你的问题,请参考以下文章
hdu4612 无向图中随意加入一条边后使桥的数量最少 / 无向图缩点+求树的直径
是否有一种生产安全的方法来测量使用 Python 在生产中花费的时间?