『圖』鑰匙和房間841

題目相關

題目解讀

由題意知,各房間與其內其他房間的鑰匙構成了有向圖的結點和邊,我們需要做的是判斷是否存在所有某點通往其他結點的路徑。

C++相關

如果是DFS,我們可以通過編寫遞歸函數來實現;如果是BFS,我們可以考慮集合+隊列來實現。

具體實現

BFS:

class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        set<int> visited; //已訪問房間集合
        queue<int> tmp; //待訪問房間隊列
        tmp.push(0);
        visited.insert(0);
        while (!tmp.empty()) {
            int i = tmp.front();
            tmp.pop();
            for (int j : rooms[i]) {
                if (!visited.count(j)) { //j號房間未被訪問
                    visited.insert(j);
                    tmp.push(j);
                }
            }
        }
        return visited.size() == rooms.size();
    }
};

DFS:

class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        set<int> visited; //已訪問房間集合
        BFS(rooms, visited, 0);
        return visited.size() == rooms.size();
    }
    void DFS(vector<vector<int>>& rooms, set<int>& visited, int num) {
        visited.insert(num);
        for (int i: rooms[num]) {
            if (!visited.count(i)) {
                BFS(rooms, visited, i);
            }
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章