題目相關
- 原題鏈接:841. 鑰匙和房間 - 力扣(LeetCode)
- 涉及知識:圖、深度優先遍歷、廣度優先遍歷
- 題目難度:★
題目解讀
由題意知,各房間與其內其他房間的鑰匙構成了有向圖的結點和邊,我們需要做的是判斷是否存在所有某點通往其他結點的路徑。
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);
}
}
}
};