知识点
拓扑排序
思路
和上一道题完全一样,只需要在bfs出队的时候记录下顺序即可。
如果结果数组记录已达的点的个数等于全部个数,证明全部点可达;否则返回空数组。
时间复杂度
点数为n 边数为m
时间复杂度为
AC code(C++)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numCows int整型 * @param feedOrders int整型vector<vector<>> * @return int整型vector */ vector<int> findFeedOrderII(int numCows, vector<vector<int> >& feedOrders) { // 拓扑排序 vector<vector<int>> g(numCows); vector<int> d(numCows, 0); for (auto& v : feedOrders) { int a = v[0], b = v[1]; g[b].push_back(a); d[a] += 1; } // bfs queue<int> q; for (int i = 0; i < numCows; i ++) { if (!d[i]) { q.push(i); } } vector<int> res; while (!q.empty()) { auto t = q.front(); res.push_back(t); q.pop(); for (auto x : g[t]) { if (-- d[x] == 0) { q.push(x); } } } if (res.size() == numCows) return res; return {}; } };