拓扑排序,可以用dfs逆着记录拓扑顺序,也可以用bfs顺着记录拓扑顺序。我喜欢后者。
另外记录一下vector的全局变量的resize和auto:枚举的用法,感觉很方便。
另外感慨一下现在边表写的真方便啊,因为vector可以动态申请空间,以前只能用数组的时候还要写个很麻烦的边表。
附上官方题解:https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-solution/
class Solution {
private:
vector<vector<int>> edges;
vector<int> indeg;
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
indeg.resize(numCourses);
for (auto inf : prerequisites)
{
indeg[inf[0]]++;
edges[inf[1]].push_back(inf[0]);
}
queue<int> q;
int count=0;
for (int i=0;i<numCourses;i++)
if (indeg[i]==0)
{
count++;
q.push(i);
}
while (!q.empty())
{
int w=q.front();
q.pop();
for (auto x : edges[w])
{
if (--indeg[x]==0)
{
q.push(x);
count++;
}
}
}
if (count==numCourses) return true;
else return false;
}
};