【问题标题】:What is the most efficient way to get all subtrees from node array and edge vector?从节点数组和边向量中获取所有子树的最有效方法是什么?
【发布时间】:2016-03-09 04:34:15
【问题描述】:

假设有像这样的数组的节点和像这样的向量的无向边:

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。这些数字表示数组的索引。在这种情况下,最大子树的大小是 0-2-4 的 3,最小子树的大小显然是 1。

我解决了这个问题:

  1. 排序edges向量
  2. edges 中选择一种排列
  3. 重复 2 直到探索所有可能的情况

但是我不确定这是有效的方法。 我怎样才能像这样获得问题域中的所有子树?有什么通用有效的方法吗?

【问题讨论】:

  • 我误解了这个问题并删除了我的答案。对于生成所有对,您的算法似乎很好。想想如何让选择部分更有效率。您可以使用哈希映射来跟踪当前子树中的哪些节点以更有效地添加边。

标签: c++ algorithm tree


【解决方案1】:

我使用基于边缘信息的 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2019-10-20
    • 2011-10-10
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多