DFS+拓撲排序
class Solution {
bool dfs(int i,vector<int>&flags,vector<int>&res,vector<vector<int>>&record)
{
if(flags[i]==1)return false;
if(flags[i]==-1)return true;
flags[i]=1;
for(auto j:record[i])
if(dfs(j,flags,res,record)==false)return false;
//遍歷到底之後,該節點所有相鄰節點都加入了模擬棧時,將自己加入模擬棧中
res.push_back(i);
flags[i]=-1;
return true;
}
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
//建立一個二維數組,組建鄰接表
vector<vector<int>>record(numCourses,vector<int>());
//初始化
for(auto tmp:prerequisites)
record[tmp[1]].push_back(tmp[0]);
vector<int>res;//模擬棧,最後翻轉
//0表示未被訪問過
vector<int>flags(numCourses,0);
for(int i=0;i<numCourses;i++)
{
//for(int i=0;i<numCourses&&flags[i]!=-1;i++)// 用法錯誤,邏輯錯誤
//放在此處的,跟放在for循環中不一樣的邏輯
if(flags[i]!=-1)
if(dfs(i,flags,res,record)==false)return {};
}
reverse(res.begin(),res.end());
return res;
}
};