本題是一道拓撲排序的問題,個人感覺難度還是挺大的,即便寫出來也感覺有些似懂非懂。另外我個人認為本題并沒有使用傳統(tǒng)的拓撲排序,而是通過dfs來判斷的圖 有沒有形成環(huán)路。
本題的技巧主要是
- 把二維數(shù)組轉(zhuǎn)換成類似鄰接表的圖的表示方法
- 深度優(yōu)先搜索dfs來判斷從當前頂點出發(fā)有沒有形成環(huán)路。這里需要借助flag數(shù)組來進行標記,flag有3種狀態(tài),-1表有環(huán)路,0是默認值代表還未處理,1代表無環(huán)路
- 遍歷所有頂點,都沒有形成環(huán)路,則返回true
代碼:
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& p) {
if(p.size()==0)
return true;
int n=p.size();
vector<int> flag(numCourses,0);
vector<vector<int>> tmp(numCourses,vector<int>());
for(int i=0;i<n;i++)
tmp[p[i][0]].push_back(p[i][1]);
bool ans=true;
for(int i=0;i<numCourses;i++)
ans=ans&&dfs(i,flag,tmp);
return ans;
}
bool dfs(int i,vector<int> &flag,vector<vector<int>> &tmp){
if(flag[i]==-1)
return false;
if(flag[i]==1)
return true;
flag[i]=-1;
int n=tmp[i].size();
for(int j=0;j<n;j++){
if(dfs(tmp[i][j],flag,tmp))
continue;
else
return false;
}
flag[i]=1;
return true;
}
};
預計用時10分鐘,實際用時48分鐘