802. 找到最終的安全狀態(DFS)
阿新 • • 發佈:2022-04-07
802. 找到最終的安全狀態
有一個有n
個節點的有向圖,節點按 0
到 n - 1
編號。圖由一個 索引從 0 開始 的 2D 整數陣列 graph
表示, graph[i]
是與節點 i
相鄰的節點的整數陣列,這意味著從節點 i
到 graph[i]
中的每個節點都有一條邊。
如果一個節點沒有連出的有向邊,則它是 終端節點 。如果沒有出邊,則節點為終端節點。如果從該節點開始的所有可能路徑都通向一個 終端節點 ,則該節點為 安全節點 。
返回一個由圖中所有 安全節點 組成的陣列作為答案。答案陣列中的元素應當按 升序 排列。
示例 1:
輸入:graph = [[1,2],[2,3],[5],[0],[5],[],[]] 輸出:[2,4,5,6] 解釋:示意圖如上。 節點5和節點6是終端節點,因為它們都沒有出邊。 從節點2、4、5和6開始的所有路徑都指向節點5或6。
示例 2:
輸入:graph = [[1,2,3,4],[1,2],[3,4],[0,4],[]] 輸出:[4] 解釋: 只有節點4是終端節點,從節點4開始的所有路徑都通向節點4。
提示:
n == graph.length
1 <= n <= 104
0 <= graph[i].length <= n
-
graph[i]
按嚴格遞增順序排列。 - 圖中可能包含自環。
- 圖中邊的數目在範圍
[1, 4 * 104]
內。
1 class Solution { 2 public: 3 bool IsExistSafeNode(int x, const vector<vector<int>> &graph, vector<int> &visited) { 4 // 如果訪問過.返回是否存在安全節點:visited[x]值為1表示訪問過,值為2表示存在安全節點 5 if (visited[x]) { 6 return (visited[x] == 2); 7 } 8 visited[x] = 1; 9 for (auto &val : graph[x]) { 10 if (!IsExistSafeNode(val, graph, visited)) {11 return false; 12 } 13 } 14 visited[x] = 2; 15 return true; 16 } 17 vector<int> eventualSafeNodes(vector<vector<int>>& graph) { 18 int n = graph.size(); 19 vector<int> visited(n, 0); // 儲存節點的訪問標記: 0——未訪問, 1——已訪問, 2——存在安全節點 20 vector<int> ans; 21 for (int i = 0; i < n; i++) { 22 if (IsExistSafeNode(i, graph, visited)) { 23 ans.push_back(i); 24 } 25 } 26 return ans; 27 } 28 };