code: def required_for_output(inputs, outputs, connections):
      
  
      required = set(outputs)
      s = set(outputs)
      while 1:
          # Find nodes not in S whose output is consumed by a node in s.
          t = set(a for (a, b) in connections if b in s and a not in s)
  
          if not t:
              break
  
          layer_nodes = set(x for x in t if x not in inputs)
          if not layer_nodes:
              break
  
          required = required.union(layer_nodes)
          s = s.union(t)
  
      return required
docs: Collect the nodes whose state is required to compute the final network output(s).
      :param inputs: list of the input identifiers
      :param outputs: list of the output node identifiers
      :param connections: list of (input, output) connections in the network.
      NOTE: It is assumed that the input identifier set and the node identifier set are disjoint.
      By convention, the output node ids are always the same as the output index.
  
      Returns a set of identifiers of required nodes.