这 n 个房间看成有向图中的 n 个节点,在x号房拿到了打开y号房的钥匙,可以看作是图中的 x 号点到 y 号点的一条有向边。
这样一来,问题就变成了给定一张有向图,询问从 0 号节点出发是否能够到达所有的节点。
DFS深度优先搜索
我们可以使用深度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 vis 标记当前节点是否访问过,以防止重复访问。
class Solution {
public:
vector<int> visited;
int num{0};
void dfs(vector<vector<int>>& rooms, int x)
{
if (visited[x] == 1) {
return;
}
visited[x] = 1;
num++;
for (int& room : rooms[x]) {
dfs(rooms, room);
}
return;
}
bool canVisitAllRooms(vector<vector<int>>& rooms)
{
int n = rooms.size();
visited.resize(n, 0);
dfs(rooms, 0);
return (num == n);
}
};
BFS广度优先搜索
数组 vis 标记当前节点是否访问过(或者即将要访问)
class Solution {
public:
bool canVisitAllRooms(vector<vector<int>>& rooms) {
int num{0}; //访问到的房间数
queue<int> q; //存放将要访问的房间
vector<int> visited; //访问过的/即将要访问的
int n = rooms.size();
visited.resize(n, 0);
q.push(0);
visited[0] = 1;
int x;
while (!q.empty()) {
num++;
x = q.front();
q.pop();
for (int& room : rooms[x]) {
if (visited[room] == 1) {
continue;
}
q.emplace(room);
visited[room] = 1;
}
}
return (num == n);
}
};