这似乎是一个常见的调度问题,但我没有看到解决方案甚至是什么称呼问题。这就像拓扑一样,但不同......
考虑到某些依赖关系,请说
A -> B -> D -- that is, A must come before B, which must come before D
A -> C -> D
拓扑排序可能有多种解决方案:
A, B, C, D
and A, C, B, D
都是解决方案。
我需要一个返回此算法的算法:
(A) -> (B,C) -> (D)
也就是说,做A,然后是B和C的全部,那么你就可以做D.所有歧义或不关心都被分组。
我认为Topological Sort with Grouping等算法无法正确处理以下情况。
A -> B -> C -> D -> E
A - - - > M - - - > E
为此,算法应返回
(A) -> (B, C, D, M) -> (E)
这个
A -> B -> D -> F
A -> C -> E -> F
应该返回
(A) -> (B, D, C, E) -> (F)
虽然这个
A -> B -> D -> F
A -> C -> E -> F
C -> D
B -> E
应该返回
(A) -> (B, C) -> (D, E) -> (F)
这个
A -> B -> D -> F
A -> C -> E -> F
A -> L -> M -> F
C -> D
C -> M
B -> E
B -> M
L -> D
L -> E
应该返回
(A) -> (B, C, L) -> (D, E, M) -> (F)
这个问题有名称和传统解决方案吗? (在Topological Sort with Grouping张贴的算法是否正确处理了这个?)
编辑以回答更多示例的请求:
A->B->C
A->C
应该返回
(A) -> (B) -> (C). That would be a straight topological sort.
并且
A->B->D
A->C->D
A->D
应该返回
(A) -> (B, C) -> (D)
和
A->B->C
A->C
A->D
应该返回
(A) -> (B,C,D)
答案 0 :(得分:7)
设G是图的传递闭包。设G'是从G中去除方向并取补色的无向图。 G'的连通组件是您正在寻找的组合。