思考: DFS的基本題 檢查連通性用DFS 1.進入第零號房間後可以看到有哪些房間的鑰匙 2.用DSF掃描每一個房間有哪些鑰匙可以去 3.用額外vector紀錄那些房間是可以進入的 ```c++= class Solution { public: void dfs(int i, vector<vector<int>>& rooms, vector<int>& visit){ // i 是 第n間房間 visit[i] = true; //掃描這個房間內有誰的鑰匙 for(int key : rooms[i]){ //如果有這把鑰匙但沒去過就DSF他 if(visit[key] == false){ dfs(key, rooms, visit); } } } bool canVisitAllRooms(vector<vector<int>>& rooms) { vector <int> visit (rooms.size(), false); //進入第零間room dfs(0, rooms, visit); for(int i = 0; i < visit.size(); i++){ if(visit[i] == false){ return false; } } return true; } }; ``` ```c++= class Solution { public: void dsf(int i, vector<vector<int>>& rooms, vector<bool>& v){ //已進入 i 號房 v[i] = true; //掃描這個i號房有甚麼鑰匙 for(int key : rooms[i]){ if(v[key] == false){ //代表有key號房的鑰匙但沒去過 所以去拜訪 dsf(key, rooms, v); } } } bool canVisitAllRooms(vector<vector<int>>& rooms) { vector <bool> v(rooms.size(), 0); dsf(0, rooms, v); for(bool i : v){ if(i == false){ return false; } } return true; } }; ``` ```c++= class Solution { public: void DFS(vector<vector<int>>& rooms, vector <bool>& vis, int start){ vis[start] = true; for(auto i : rooms[start]){ if(i != NULL && vis[i] == false){ DFS(rooms, vis, i); } } } bool canVisitAllRooms(vector<vector<int>>& rooms) { int n = rooms.size(); vector <bool> vis(n, false); DFS(rooms, vis, 0); for(auto i : vis){ if(i == false){ return false; } } return true; } }; ```