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

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,表示到目前为止已访问的节点数。每次遍历一条边时,由于树的特殊属性,通过删除该边形成的两个组件的大小必须等于 countN - count(具体来说,任何一对节点之间只有一条路径)。这会产生一个具有O(N) 预处理和O(1) 查询回答的算法,总时间复杂度为O(N + Q)

【讨论】:

工作正常。事实上,你可以在任何你喜欢的地方扎根树。

以上是关于删除边后,是不是有一种有效的方法可以在生成树图中查找组件的大小?的主要内容,如果未能解决你的问题,请参考以下文章

hdu4612 无向图中随意加入一条边后使桥的数量最少 / 无向图缩点+求树的直径

是否有一种生产安全的方法来测量使用 Python 在生产中花费的时间?

[APIO2008]免费道路

Xcode中是不是有一种简单的方法可以从末尾删除完成块?

R 中的 X 和 Y 坐标。是不是有一种明显的方法可以删除距离给定点一定半径的数据?

是否有一种算法可以在无向图中找到成本最高的长度为 k 的路径