1. 程式人生 > 其它 >leetcode 找到最終安全狀態

leetcode 找到最終安全狀態

這道題最初我的想法是遍歷+BFS但時間超了,所以在這裡給一個官方的解答:

深度優先搜尋 + 三色標記法
根據題意,若起始節點位於一個環內,或者能到達一個環,則該節點不是安全的。否則,該節點是安全的。

我們可以使用深度優先搜尋來找環,並在深度優先搜尋時,用三種顏色對節點進行標記,標記的規則如下:

白色(用 00 表示):該節點尚未被訪問;
灰色(用 11 表示):該節點位於遞迴棧中,或者在某個環上;
黑色(用 22 表示):該節點搜尋完畢,是一個安全節點。
當我們首次訪問一個節點時,將其標記為灰色,並繼續搜尋與其相連的節點。

如果在搜尋過程中遇到了一個灰色節點,則說明找到了一個環,此時退出搜尋,棧中的節點仍保持為灰色,這一做法可以將「找到了環」這一資訊傳遞到棧中的所有節點上。

如果搜尋過程中沒有遇到灰色節點,則說明沒有遇到環,那麼遞迴返回前,我們將其標記由灰色改為黑色,即表示它是一個安全的節點。

連結:https://leetcode-cn.com/problems/find-eventual-safe-states/solution/zhao-dao-zui-zhong-de-an-quan-zhuang-tai-yzfz/

class Solution {
    public List<Integer> eventualSafeNodes(int[][] graph) {
        int n = graph.length;
        int[] color = new
int[n]; List<Integer> ans = new ArrayList<Integer>(); for (int i = 0; i < n; ++i) { if (safe(graph, color, i)) { ans.add(i); } } return ans; } public boolean safe(int[][] graph, int[] color, int x) {
if (color[x] > 0) { return color[x] == 2; } color[x] = 1; for (int y : graph[x]) { if (!safe(graph, color, y)) { return false; } } color[x] = 2; return true; } }