Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从节点数组和边向量中获取所有子树的最有效方法是什么?_C++_Algorithm_Tree - Fatal编程技术网

C++ 从节点数组和边向量中获取所有子树的最有效方法是什么?

C++ 从节点数组和边向量中获取所有子树的最有效方法是什么?,c++,algorithm,tree,C++,Algorithm,Tree,假设有作为数组的节点和作为向量的无向边,如下所示: 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)); int节点[n]={1,2,3,…,n}; 矢量边; 边。推回(标准::使_对(0,2)); 边缘。推回(标准::形成对(2,4));

假设有作为数组的节点和作为向量的无向边,如下所示:

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));
int节点[n]={1,2,3,…,n};
矢量边;
边。推回(标准::使_对(0,2));
边缘。推回(标准::形成对(2,4));
其中,数组的每个元素都是值,
n
是数组的数目。按照上面的代码,有两条边。一个是从0到2。另一个是从2到4。这些数字表示数组的索引。在这种情况下,最大子树的大小是3:0-2-4,最小子树的大小显然是1

我是这样解决的:

  • 排序
    向量
  • 边中选择一个排列
  • 重复2次,直到探索所有可能的情况
  • 然而,我不确定这是有效的方法。
    如何获得问题域中的所有子树?有什么通用而有效的方法吗?

    我使用基于边缘信息的BFS(广度优先搜索)解决了这个问题。为了避免生成循环图并将节点保持为树,我使用了
    set
    。在搜索之前,我还应用了
    排序
    。这有助于降低时间复杂度

    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);
    }
    
    void BFS(设置节点、向量和边、向量和结果){
    结果。推回(节点);
    int lastNode=*max_元素(nodes.begin(),nodes.end());
    auto findIt=find_if(edges.begin()、edges.end()、[](常量对和元素){return element.first==lastNode});
    if(findIt!=edges.end()){
    insert((*findIt.second);
    BFS(节点、边、结果);
    }
    }
    排序(edges.begin()、edges.end());
    矢量结果;
    用于(自动编辑:边){
    设置节点;
    nodes.insert((*it.first);
    nodes.insert((*it.second);
    BFS(节点、边、结果);
    }
    
    我误解了这个问题,删除了我的答案。对于生成所有对,您的算法似乎很好。只要想想如何使选择的部分更有效率。可以使用哈希映射跟踪当前子树中的节点,以便更有效地添加边。