【发布时间】: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。
我解决了这个问题:
- 排序
edges向量 - 在
edges中选择一种排列 - 重复 2 直到探索所有可能的情况
但是我不确定这是有效的方法。 我怎样才能像这样获得问题域中的所有子树?有什么通用有效的方法吗?
【问题讨论】:
-
我误解了这个问题并删除了我的答案。对于生成所有对,您的算法似乎很好。想想如何让选择部分更有效率。您可以使用哈希映射来跟踪当前子树中的哪些节点以更有效地添加边。