【图论2】【深度优先遍历】
class Solution {
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
//定义一个访问数组,用来保存房间是否被访问过
boolean[] visited = new boolean[rooms.size()];
dfs(rooms,0,visited);
for(int i=0; i<visited.length; i++){
if(!visited[i]) return false;
}
return true;
}
public void dfs(List<List<Integer>> rooms, int n, boolean[] visited){
//如果当前房间已经访问过则返回
if(visited[n]) return;
//如果没有访问过,现在访问了则做一下访问标记
visited[n] = true;
//遍历本房间内的所有关联房间
for(int i : rooms.get(n)){
dfs(rooms,i,visited);
}
return;
}
}
总结:本题与【leetcode 797. 所有可能的路径】不同之处在于,本题不需要回溯,因为不需要知道所走的路径。本题只需要知道是否所有的房间都被访问了,因此通过设置一个 “访问数组” 进行记录,如果搜索结束只要有值为false,则表明一定至少存在一个房间被访问。