原材料的入度一定为0,将原材料作为出发点 ,进行拓扑排序,里面的点一定就是可以做出来的菜。
class Solution {
public:
vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>& ingredients, vector<string>& supplies) {
unordered_map<string, vector<string>> edges;
unordered_map<string, int> cnt;
for (int i = 0; i < recipes.size(); i++) {
for (auto& ingredient : ingredients[i]) {
edges[ingredient].emplace_back(recipes[i]);
}
cnt[recipes[i]] = ingredients[i].size();
}
vector<string> res;
queue<string> q;
for (auto& supply : supplies) {
q.push(supply);
}
while (!q.empty()) {
auto t = q.front(); q.pop();
for (auto & next : edges[t]) {
if (--cnt[next] == 0) {
q.push(next);
res.emplace_back(next);
}
}
}
return res;
}
};