gpt4 book ai didi

java - 带分组的拓扑排序

转载 作者:可可西里 更新时间:2023-11-01 16:40:06 24 4
gpt4 key购买 nike

好的,所以在根据输入数据进行拓扑排序时,通常有多个正确的解决方案,可以按照这些解决方案的顺序对图进行“处理”,以便所有依赖项都出现在“依赖”于它们的节点之前。但是,我正在寻找一个稍微不同的答案:

假设有以下数据: a -> bc -> d ( a 必须在 b 之前并且 c 必须在 d 之前)。
仅凭这两个约束,我们就有多个候选解决方案:( a b c da c d bc a b d 等)。但是,我希望创建一种“分组”这些节点的方法,以便在处理一组之后,下一组中的所有条目都会处理它们的依赖关系。对于上面假设的数据,我会寻找像 (a, c) (b, d) 这样的分组.在每个组中,处理节点的顺序无关紧要( ac 之前或 bd 之前,等等,反之亦然)只要第 1 组 (a, c)在第 2 组中的任何一个之前完成 (b, d)被处理。

唯一的额外问题是每个节点都应该在尽可能早的组中。请考虑以下事项:
a -> b -> c
d -> e -> f
x -> y

(a, d) (b, e, x) (c, f, y)的分组方案技术上是正确的,因为 xy 之前, 一个更优的解决方案是 (a, d, x) (b, e, y) (c, f)因为有 x在第 2 组中意味着 x依赖于组 1 中的某个节点。

关于如何做这件事有什么想法吗?


编辑:我想我设法拼凑了一些解决方案代码。感谢所有提供帮助的人!

// Topological sort
// Accepts: 2d graph where a [0 = no edge; non-0 = edge]
// Returns: 1d array where each index is that node's group_id
vector<int> top_sort(vector< vector<int> > graph)
{
int size = graph.size();
vector<int> group_ids = vector<int>(size, 0);
vector<int> node_queue;

// Find the root nodes, add them to the queue.
for (int i = 0; i < size; i++)
{
bool is_root = true;

for (int j = 0; j < size; j++)
{
if (graph[j][i] != 0) { is_root = false; break; }
}

if (is_root) { node_queue.push_back(i); }
}

// Detect error case and handle if needed.
if (node_queue.size() == 0)
{
cerr << "ERROR: No root nodes found in graph." << endl;
return vector<int>(size, -1);
}


// Depth first search, updating each node with it's new depth.
while (node_queue.size() > 0)
{
int cur_node = node_queue.back();
node_queue.pop_back();

// For each node connected to the current node...
for (int i = 0; i < size; i++)
{
if (graph[cur_node][i] == 0) { continue; }

// See if dependent node needs to be updated with a later group_id
if (group_ids[cur_node] + 1 > group_ids[i])
{
group_ids[i] = group_ids[cur_node] + 1;
node_queue.push_back(i);
}
}
}

return group_ids;
}

最佳答案

用级别值 0 标记所有根节点。用级别值 parent+1 标记所有子节点。如果正在重新访问节点,即它已经分配了级别值,请检查先前分配的值是否低于新值。如果是这样,用更高的值更新它并将它们传播给后代。

现在,您拥有的组数与唯一级别标签 0 ... K 的数量一样多

关于java - 带分组的拓扑排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com