I'll walk through the topological sort approach using Kahn's algorithm. Track each recipe's unmet ingredient count, and propagate availability from supplies outward.
function findAllRecipes(recipes, ingredients, supplies):
recipeSet = set(recipes)
graph = empty adjacency map
inDegree = empty map
for i from 0 to recipes.length - 1:
inDegree[recipes[i]] = ingredients[i].length
for each ing in ingredients[i]:
graph[ing].append(recipes[i])
queue = list(supplies)
result = []
while queue is not empty:
item = queue.dequeue()
if item in recipeSet:
result.append(item)
if item in graph:
for each dependent in graph[item]:
inDegree[dependent] -= 1
if inDegree[dependent] == 0:
queue.enqueue(dependent)
return result