Leetcode 802.找到最終的安全狀態(圖論:判斷從該節點出發是否構成環)

 

這道題目的意思是,判斷從每個節點出發的路徑是否構成環,最直觀的思路就是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的點出發,反向的進行拓撲排序,就能找出所有完全的點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章