मैं एक ऐसी ही समस्या थी और यह इस तरह से सुलझाने समाप्त हो गया:
मेरे डेटा संरचना है कि (में उस पर निर्भर यानी अपने अनुयायियों नोड्स की एक सूची के लिए एक नोड आईडी से, dependends
शब्दकोश से बना है। DAG)। ध्यान दें कि यह केवल एक डीएजी के लिए काम करता है - जिसे निर्देशित किया जाता है, विश्वकोश ग्राफ।
मैंने इसकी सटीक जटिलता की गणना नहीं की है, लेकिन यह एक विभाजित दूसरे में कई हजारों के अपने ग्राफ को निगल लिया है।
_transitive_closure_cache = {}
def transitive_closure(self, node_id):
"""returns a set of all the nodes (ids) reachable from given node(_id)"""
global _transitive_closure_cache
if node_id in _transitive_closure_cache:
return _transitive_closure_cache[node_id]
c = set(d.id for d in dependents[node_id])
for d in dependents[node_id]:
c.update(transitive_closure(d.id)) # for the non-pythonists - update is update self to Union result
_transitive_closure_cache[node_id] = c
return c
def can_reduce(self, source_id, dest_id):
"""returns True if the edge (source_id, dest_id) is redundant (can reach from source_id to dest_id without it)"""
for d in dependents[source_id]:
if d.id == dest_id:
continue
if dest_id in transitive_closure(d.id):
return True # the dest node can be reached in a less direct path, then this link is redundant
return False
# Reduce redundant edges:
for node in nodes:
dependents[node.id] = [d for d in dependents[node.id] if not can_reduce(node.id, d.id)]
क्या हम इसके बजाय बी ---> सी को अनावश्यक मान सकते हैं? –
क्या अनावश्यक मतलब है "एक्स से वाई तक गैर किनारे पथ होने पर एक किनारे एक्स-> वाई अनावश्यक है" या आप बस एक स्पैनिंग पेड़ की तलाश में हैं? –
@Zach: नहीं, बी-> सी अनावश्यक नहीं है, क्योंकि अगर इसे हटा दिया जाता है तो बी से सी – ShreevatsaR