如果您使用 OO 解决方案,很容易提供一种仅存储最重路径的方法。这是我想出的解决方案 - 使用可调用类
In [111]: class Heaviest(object):
     ...:     def __init__(self, job):
     ...:         self.path = ''
     ...:         self.weight = 0
     ...:         self.job = job
     ...:     def _find_heaviest(self, job, path='', weight=0):
     ...:         path += job.name
     ...:         weight += job.weight
     ...:         if not job.depends:
     ...:             if weight > self.weight:
     ...:                 self.weight = weight
     ...:                 self.path = path
     ...:         else:
     ...:             for job in job.depends:
     ...:                 self._find_heaviest(job, path, weight)
     ...:     def __call__(self):
     ...:         self._find_heaviest(self.job)
     ...:         return '->'.join(list(self.path)), self.weight
     ...:                 
In [112]: Heaviest(jobA)()
Out[112]: ('A->B->D->F', 25)
事后思考:
昨晚我突然想到,在循环依赖的情况下(请参阅我的评论),上面的解决方案不会产生答案,当达到最大递归深度时会异常停止。只需添加下面的行将破坏任何树遍历算法 - 不仅仅是这个。
In [226]: jobF.add_dependent(jobA)
In [227]: Heaviest(jobA)()
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-227-94e994624b4e> in <module>()
----> 1 Heaviest(jobA)()
<ipython-input-111-1ff9f69480a9> in __call__(self)
     15                 self._find_heaviest(job, path, weight)
     16     def __call__(self):
---> 17         self._find_heaviest(self.job)
     18         return '->'.join(list(self.path)), self.weight
     19 
<ipython-input-111-1ff9f69480a9> in _find_heaviest(self, job, path, weight)
     13         else:
     14             for job in job.depends:
---> 15                 self._find_heaviest(job, path, weight)
     16     def __call__(self):
     17         self._find_heaviest(self.job)
... last 1 frames repeated, from the frame below ...
<ipython-input-111-1ff9f69480a9> in _find_heaviest(self, job, path, weight)
     13         else:
     14             for job in job.depends:
---> 15                 self._find_heaviest(job, path, weight)
     16     def __call__(self):
     17         self._find_heaviest(self.job)
RuntimeError: maximum recursion depth exceeded
虽然我将尝试修改实现留给您 - 如果您愿意 - 简单的保护措施可以解决这个问题
def _find_heaviest(self, job, path='', weight=0):
    if not job.name in path:
        path += job.name
        weight += job.weight
        stop_search = not job.depends
    else:
        stop_search = True
    if stop_search:
        if weight > self.weight:
......
问题解决了
In [230]: Heaviest(jobA)()
Out[230]: ('A->B->D->F', 25)