// class Solution {
// public:
// /**
// * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
// *
// *
// * @param numCows int整型
// * @param feedOrders int整型vector<vector<>>
// * @return bool布尔型
// */
// bool canFeedAllCows(int numCows, vector<vector<int> >& feedOrders) {
// // write code here
// vector<vector<int>> next(numCows);
// vector<int> indegree(numCows);
// queue<int> zeroq;
// for (auto &feedOrder: feedOrders) {
// int ai = feedOrder[0];
// int bi = feedOrder[1];
// next[bi].push_back(ai);
// indegree[ai]++;
// }
// for (int i = 0; i < numCows; i++) {
// if (indegree[i] == 0)
// zeroq.push(i);
// }
// while(!zeroq.empty()) {
// int cow = zeroq.front();
// zeroq.pop();
// numCows--;
// for (auto &nextCow: next[cow]) {
// if (--indegree[nextCow] == 0) zeroq.push(nextCow);
// }
// }
// if (numCows) return false;
// else return true;
// }
// };
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numCows int整型
* @param feedOrders int整型vector<vector<>>
* @return bool布尔型
*/
bool canFeedAllCows(int numCows, vector<vector<int> >& feedOrders) {
// write code here
// 以ai为“先修课”的牛的数量
vector<int> v(numCows,0);
// 以ai为“先修课”的牛有哪一些
vector<vector<int>> v_v(numCows);
for(const auto info:feedOrders)
{
// info[1]先喂
v_v[info[1]].emplace_back(info[0]);
// info[0]得为0,才表示它能开始喂
++v[info[0]];
}
queue<int> q_v;
for(int i=0; i<numCows; ++i)
{
// 牛 i 没有限制,不需要喂养其它牛后才来喂养v[i]
if(v[i]==0)
q_v.emplace(i);
}
while(!q_v.empty())
{
// 修改之后
int i = q_v.front();
q_v.pop();
--numCows;
for(auto temp: v_v[i])
{
--v[temp];
// 如果t[j]的“先修课”为 0,则加入队列
if(v[temp]==0)
q_v.emplace(temp);
}
}
return numCows==0 ? true : false;
}
};