我在这种情况下尝试表示和操作依赖图时遇到了一些麻烦:
我从目标节点开始并以递归方式查找其依赖关系,但必须保留上述属性,特别是第三个属性。
这里只是一个小例子:
我想要一张如下图所示的图表
(A)
/ \
/ \
/ \
[(B),(C),(D)] (E)
/\ \
/ \ (H)
(F) (G)
表示:
所以,如果我写下所有可能的拓扑排序路径到A,我应该:
如何使用这些属性建模图形?哪种数据结构更适合这样做?
答案 0 :(得分:2)
您应该使用具有附加属性的普通邻接列表,其中节点知道其也满足相同依赖性的其他节点。这意味着B,C,D都应该知道它们属于同一个等价类。您可以通过将它们全部插入到集合中来实现此目的。
Node:
List<Node> adjacencyList
Set<Node> equivalentDependencies
要在topo-sort中使用此数据结构,每当删除源并删除其所有传出边时,还要删除其等效类中的节点及其传出边,并递归删除指向它们的节点。 来自维基百科:
L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
remove a node n from S
add n to tail of L
for each node o in the equivalency class of n <===removing equivalent dependencies
remove j from S
for each node k with an edge e from j to k do
remove edge e from the graph
if k has no other incoming edges then
insert k into S
for each node m with an edge e from n to m do
remove edge e from the graph
if m has no other incoming edges then
insert m into S
if graph has edges then
return error (graph has at least one cycle)
else
return L (a topologically sorted order)
此算法将为您提供经过修改的拓扑排序路径之一。