code: def _getImpliedEdges(roots):
          
          #Get nodes in job graph
          nodes = set()
          for root in roots:
              root._dfs(nodes)
  
          ##For each follow-on edge calculate the extra implied edges
          #Adjacency list of implied edges, i.e. map of jobs to lists of jobs
          #connected by an implied edge
          extraEdges = dict([(n, []) for n in nodes])
          for job in nodes:
              if len(job._followOns) > 0:
                  #Get set of jobs connected by a directed path to job, starting
                  #with a child edge
                  reacheable = set()
                  for child in job._children:
                      child._dfs(reacheable)
                  #Now add extra edges
                  for descendant in reacheable:
                      extraEdges[descendant] += job._followOns[:]
          return extraEdges
docs: Gets the set of implied edges. See Job.checkJobGraphAcylic