从节点数组和边缘向量获取所有子树的最有效方法是什么
What is the most efficient way to get all subtrees from node array and edge vector?
假设有节点作为数组,有无向边作为向量,如下所示:
int nodes[n] = {1, 2, 3, ... ,n };
vector<pair<int, int>> edges;
edges.push_back(std::make_pair(0, 2));
edges.push_back(std::make_pair(2, 4));
其中数组的每个元素都是值,n
是数组的数量。在上面的代码之后,有两个边缘。一个是从 0 到 2。另一个是从 2 到 4。这些数字表示数组的索引。在这种情况下,最大子树的大小是 3 到 0-2-4,最小子树的大小显然是 1。
我像下面这样解决了这个问题:
edges
向量排序- 在
edges
中选择一个排列 - 重复 2 直到探索所有可能的情况
但是,我不确定这是有效的方法。如何像这样获取问题域中的所有子树?有没有通用有效的方法?
我使用基于边缘信息的BFS(广度优先搜索)解决了这个问题。为了避免制作循环图并将节点保留为树,我使用 set
.而且我也在搜索之前应用sort
。它有助于降低时间复杂度。
void BFS(set<int> nodes, vector<pair<int,int>>& edges, vector<set<int>>& result) {
result.push_back(nodes);
int lastNode = *max_element(nodes.begin(), nodes.end());
auto findIt = find_if(edges.begin(), edges.end(), [](const pair<int, int>& element){ return element.first == lastNode});
if(findIt != edges.end()) {
nodes.insert((*findIt).second);
BFS(nodes, edges, result);
}
}
sort(edges.begin(), edges.end());
vector<set<int>> result;
for(auto it : edges) {
set<int> nodes;
nodes.insert((*it).first);
nodes.insert((*it).second);
BFS(nodes, edges, result);
}
相关文章:
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 这是什么代码?为什么它有效?C++
- 找到对称矩阵的最大元素的最有效算法是什么
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 是什么使这个以'+'开头的字符串添加成为有效的语句?
- 释放 std::vector 中指针内存的最有效方法是什么?
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 有效创建数字签名的正确方法是什么?我可以使用DSA_sign_setup()吗?
- 填充红黑树的最有效方法是什么?
- 释放分配给大量矢量的内存的最有效方法是什么?
- 在使用 0MQ 异步接收时异步发送数据的最有效方法是什么?
- 在 c++ 中使用右值设置类变量的最有效方法是什么
- 检查字符串是否与可能的输入之一匹配的最有效方法是什么?
- 将随机数放入缓冲区以写入文件的有效方法是什么?
- 从向量中提取最小值、最大值和中位数的最有效方法是什么