1. 程式人生 > 其它 >802. 找到最終的安全狀態(DFS)

802. 找到最終的安全狀態(DFS)

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 };