从树中删除一个顶点后,查询连通分量的数量
以下查询可用于确定删除树顶点后剩余的连通分量:首先考虑树结构。然后,通过使用广度优先或深度优先搜索算法在树中移动,检查每个连接的组件。一旦所需的顶点被驱逐,就使用相同的遍历方法来决定连接组件的数量。结果将根据开除前后计数的变化来决定。该方法有效地监视连接变化并帮助计算更新树中的连接组件。
使用的方法
深度优先搜索 (DFS) 方法
并查法
深度优先搜索 (DFS) 方法
在 DFS 方法中,我们首先从原始树中的任何选定节点执行 DFS 遍历,以在从树中删除顶点后对连接的组件进行计数。在此遍历过程中,我们遍历每个连接的节点,将每个节点标记为已访问,并跟踪使用 DFS 的次数。我们在删除指定顶点后执行新的 DFS 遍历,确保在探索阶段跳过删除的顶点。我们可以通过比较删除前后调用 DFS 的次数来确定更新树中连通分量的数量。这种方法可以有效地计算连接元素的数量,同时根据树结构的变化进行调整。
算法
选取原树上的任意一个顶点作为DFS遍历的起点。
设置变量“count”以开始对连接的组件进行计数。首先,将其设置为 0。
从选定的起始顶点,使用 DFS 遍历树。
标记 DFS 遍历期间访问的每个顶点,并为每个新的 DFS 调用(即,对于找到的每个连接组件)将“计数”增加 1。
DFS遍历完成后,原树中连通元素的数量将用“count”表示。
从树中删除指定的顶点。
从同一起始顶点重复 DFS 遍历,确保避免探索已删除的顶点。
在运行 DFS 时,与之前类似地更新“count”变量。
升级后的树中关联组件的数量将通过从开始的“计数”中减去疏散后的“计数”来确定。
示例
#include <iostream> #include <vector> void dfs(const std::vector<std::vector<int>>& tree, int v, std::vector<bool>& visited, int& count) { visited[v] = true; count++; for (int u : tree[v]) { if (!visited[u]) { dfs(tree, u, visited, count); } } } int countConnectedComponents(const std::vector<std::vector<int>>& tree, int startVertex) { int n = tree.size(); std::vector<bool> visited(n, false); int count = 0; dfs(tree, startVertex, visited, count); return count; } int main() { std::vector<std::vector<int>> tree = { {1, 2}, {0, 3}, {0, 4}, {1}, {2} }; int startVertex = 0; std::cout << countConnectedComponents(tree, startVertex) << std::endl; return 0; }
输出
5
并查法
我们首先在并查找方法中将每个顶点初始化为单独的组件,以便在从树中删除顶点后对连接的组件进行计数。为了跟踪原始树中的部件和连接,我们采用并查找数据结构。我们更新并查数据结构以反映删除指定顶点后树的连通性的变化。然后计算并查数据结构中不同集合的数量。得到的计数代表了树的更新组件的连通性。删除顶点后,并查找方法可以有效地计算连通分量并有效处理树中的结构变化。
算法
从头开始创建一个数组或数据结构,将每个顶点表示为树的不同部分。最初,每个顶点都是其自己的父顶点。
在预处理步骤中使用并查找操作来确定原始树的连接组件计数。
使用并查数据结构来组合树中每条边 (u, v) 包含顶点 u 和 v 的部分。树的初始连通性在此步骤中建立。
从树中删除指定的顶点。
将预处理步骤的并查找操作应用于修改后的树。
删除后,计算并查数据结构中不同父代代表的数量。
结果计数代表了树更新组件的连通性。
示例
#include <iostream> #include <vector> class UnionFind { public: UnionFind(int n) { parent.resize(n); for (int i = 0; i < n; ++i) { parent[i] = i; } } int find(int u) { if (parent[u] != u) { parent[u] = find(parent[u]); } return parent[u]; } void unite(int u, int v) { int rootU = find(u); int rootV = find(v); if (rootU != rootV) { parent[rootU] = rootV; } } int countDistinctParentRepresentatives() { int n = parent.size(); std::vector<bool> distinct(n, false); for (int i = 0; i < n; ++i) { distinct[find(i)] = true; } int count = 0; for (bool isDistinct : distinct) { if (isDistinct) { count++; } } return count; } private: std::vector<int> parent; }; int main() { int n = 5; UnionFind uf(n); uf.unite(0, 1); uf.unite(0, 2); uf.unite(2, 3); uf.unite(2, 4); std::cout << uf.countDistinctParentRepresentatives() << std::endl; return 0; }
输出
1
结论
总之,所提供的方法可以有效地计算删除特定顶点后树中连接部分的数量。使用深度优先搜索 (DFS) 方法和并查找方法可以有效地处理树结构中的连通性变化。DFS 方法从选定顶点开始遍历,标记访问过的每个节点,并统计连接的组件。更新后的计数是通过比较删除顶点后的前后遍历计数来获得的,并且在不包括删除的节点的情况下执行新的遍历。
初始连接组件计数是通过 Union-Find 方法使用并集运算来确定的,该方法将每个顶点初始化为单独的组件。删除顶点后应用相同的并集操作,并对不同的父代表进行计数以获得更新的计数。
删除顶点后,这两种方法都可以提供对树的连通性的有用见解,并且适用于各种场景。
以上是从树中删除一个顶点后,查询连通分量的数量的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

本文解释了C标准模板库(STL),重点关注其核心组件:容器,迭代器,算法和函子。 它详细介绍了这些如何交互以启用通用编程,提高代码效率和可读性t

本文详细介绍了c中有效的STL算法用法。 它强调了数据结构选择(向量与列表),算法复杂性分析(例如,std :: sort vs. std vs. std :: partial_sort),迭代器用法和并行执行。 常见的陷阱

本文详细介绍了C中的有效异常处理,涵盖了尝试,捕捉和投掷机制。 它强调了诸如RAII之类的最佳实践,避免了不必要的捕获块,并为强大的代码登录例外。 该文章还解决了Perf

本文讨论了使用C中的移动语义来通过避免不必要的复制来提高性能。它涵盖了使用std :: Move的实施移动构造函数和任务运算符,并确定了关键方案和陷阱以有效

文章讨论了在C中有效使用RVALUE参考,以进行移动语义,完美的转发和资源管理,重点介绍最佳实践和性能改进。(159个字符)

C 20范围通过表现力,合成性和效率增强数据操作。它们简化了复杂的转换并集成到现有代码库中,以提高性能和可维护性。

本文讨论了C中的动态调度,其性能成本和优化策略。它突出了动态调度会影响性能并将其与静态调度进行比较的场景,强调性能和之间的权衡
