tree - 在跟踪组件数量时移除森林顶点
问题描述
给定具有n
顶点和q
查询的树(n, q <= 5*10^5)
,对于每个查询,您可以删除或恢复以前删除的顶点,在每次操作后输出连接组件的数量。
我试过用这个公式
components = components + (removing ? 1 : -1)*(degree[v] - 1)
v
被删除/恢复的顶点在哪里。
这里的问题是我必须跟踪所有度数,或者更新所有邻居的度数,或者标记哪些节点被删除并通过检查哪些邻居被删除v
来计算度数,这两种解决方案都需要遍历.v
v
我考虑过颠倒查询顺序和/或使用不相交的集合,但这仍然会单独处理每个边缘。
有没有办法改进这个解决方案?
解决方案
好的,这就是我想出的:
首先,任意根树,同时还计算一个父和度数组。我还使树定向,所以除了根的所有度都小一,但这可能不是必需的。
现在更新节点时只需要更新父级的度数。
sign = removing ? 1 : -1
if v == root
components += sign*(deg[v] - 1)
else
deg[parent[v]] -= sign
components += sign*(deg[v] - deleted[parent[v]])
其中deleted 是一个布尔数组。
还发现这适用于森林
components(E, V) = V - E
推荐阅读
- database - 在 presto、hive 中查询数组结构
- java - 在 Web3j 以太坊交易中设置十六进制编码的数据字段
- java - 代码 14:无法打开数据库
- java - 具有自定义数据源偏移量的 Android 分页库 RecyclerView 中的项目
- python-3.x - 程序不解析标签
- javascript - 将 Speech to Text 模块添加到 C# bot
- javascript - 使用 jquery 动态设置活动选项卡
- c - linux execve,分段错误(strcmp_sse42)
- python - 使用数组查找 TensorFlow 哈希表
- python - Python(TKinter)GUI不会显示文本