LC841.钥匙和房间
LC841.钥匙和房间
思路1:DFS
- 此题的关键在于联想转化成图的遍历问题。
 - 等价于图的遍历,
rooms[i] 里面放着t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边 - 如果可以遍历所有的节点,就能够去到所有的房间
 - 第一个示例
[[1], [2], [3], []]可以转化成以下的图。 
代码:
class Solution {public:    void dfs(vector<vector<int>>& rooms, vector<bool>& vis, int cur_pos) {        vis[cur_pos] = true;        vector<int> nxt_pos = rooms[cur_pos];        for (int i = 0, n = nxt_pos.size(); i < n; i++) {            if (!vis[nxt_pos[i]])                dfs(rooms, vis, nxt_pos[i]);        }     }    bool canVisitAllRooms(vector<vector<int>>& rooms) {        // 等价于图的遍历,rooms[i] 里面放着 t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边        // 如果可以遍历所有的节点,就能够去到所有的房间        int n = rooms.size();        vector<bool> vis(n, false);        dfs(rooms, vis, 0);        for (int i = 0; i < n; i++) {            if (vis[i] == false) {                return false;            }        }        return true;    }};
思路2:BFS
- 相当于图的BFS
 有了联想就不难了
代码2:
class Solution {public:  void bfs(vector<vector<int>>& rooms, vector<bool>& vis) {      queue<int> q;      q.push(0);      vis[0] = true;      while (!q.empty()) {          for (int i = 0, qn = q.size(); i < qn; i++) {              int cur_pos = q.front();              q.pop();              for (int k = 0, nr = rooms[cur_pos].size(); k < nr; k++) {                  if (!vis[rooms[cur_pos][k]]) {                      q.push(rooms[cur_pos][k]);                      vis[rooms[cur_pos][k]] = true;                  }              }          }      }  }  bool canVisitAllRooms(vector<vector<int>>& rooms) {      // 等价于图的遍历,rooms[i] 里面放着 t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边      // 如果可以遍历所有的节点,就能够去到所有的房间      int n = rooms.size();      vector<bool> vis(n, false);      bfs(rooms, vis);      for (int i = 0; i < n; i++) {          if (vis[i] == false) {              return false;          }      }      return true;  }};