本题跟207的区别在于除了判断图是否有环外,还让你输出拓扑排序的一个序列。
207的时候一直没闹明白dfs跟拓扑排序的区别,通过这道题明白了,dfs其实是实现逆拓扑排序的一种手段。本题所构建的“邻接表”(tmp)其实是反向的,由顶点指向先修课程,而非先修课程指向顶点;换句话说,对于tmp这个邻接表来讲,它的逆拓扑排序其实就相当于是题目逻辑中的正拓扑排序,而逆拓扑排序又可以通过dfs来实现
class Solution {
public:
vector<int> findOrder(int num, vector<vector<int>>& pre) {
vector<int> ret;
vector<int> flag(num,0);
vector<vector<int>> tmp(num,vector<int>());
int n=pre.size();
for(int i=0;i<n;i++)
tmp[pre[i][0]].push_back(pre[i][1]);
bool ans=true;
for(int i=0;i<num;i++){
ans=ans && dfs(i,flag,tmp,ret);
}
if(ans){
return ret;
}
else
return vector<int>();
}
bool dfs(int i,vector<int> &flag,vector<vector<int>> &tmp,vector<int> &ret){
if(flag[i]==1)
return true;
if(flag[i]==-1)
return false;
flag[i]=-1;
int n=tmp[i].size();
for(int j=0;j<n;j++){
if(dfs(tmp[i][j],flag,tmp,ret))
continue;
else
return false;
}
flag[i]=1;
ret.push_back(i);
return true;
}
};
预计10分,实际32分