這道題目的意思是,判斷從每個節點出發的路徑是否構成環,最直觀的思路就是DFS,每個節點走一遍試試,這裏要注意,再標記圖是否被訪問過的時候,需要用三個狀態,0代表未訪問,1代表已經正在訪問中,2代表訪問完畢,這樣在回溯的時候就能判斷出是否兩次經過同一個節點,也就是有環。
所以DFS函數這樣實現,注意visited數組可以複用,因此傳引用。
bool dfs(vector<vector<int>>& graph, int index, vector<int> &visited){
if(visited[index]==1){
return false;
}
visited[index] = 1;
for(auto next:graph[index]){
if(visited[next]==2) continue;
if(visited[next]==1||!dfs(graph,next,visited)) return false;
}
visited[index] = 2;
return true;
}
完整代碼如下:
class Solution {
public:
vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
// 判斷從每個節點出發有沒有環
int n = graph.size();
vector<int> res;
vector<int> visited(n);
for(int i=0;i<n;i++){
if(dfs(graph,i,visited)) res.push_back(i);
}
return res;
}
bool dfs(vector<vector<int>>& graph, int index, vector<int> &visited){
if(visited[index]==1){
return false;
}
visited[index] = 1;
for(auto next:graph[index]){
if(visited[next]==2) continue;
if(visited[next]==1||!dfs(graph,next,visited)) return false;
}
visited[index] = 2;
return true;
}
};
這道題目還有以下拓撲排序的做法:
出度爲0的點一定是安全的,因此只與出度爲0的點相連接的點一定也是安全的,所以我們可以從出度爲0的點出發,反向的進行拓撲排序,就能找出所有完全的點。