从节点数组和边向量中获取所有子树的最有效方法是什么?
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);
}
假设节点为数组,无向边为向量,如下所示:
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);
}