Graph Theory 문제 3번
https://leetcode.com/problems/keys-and-rooms/
BFS
class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
unlocked = [False] * len(rooms)
unlocked[0] = True
q = collections.deque(rooms[0])
while q:
room = q.popleft()
unlocked[room] = True
for key in rooms[room]:
if unlocked[key] is False:
q.append(key)
if False in unlocked:
return False
return True
BFS
class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
unlocked = [False] * len(rooms)
unlocked[0] = True
q = deque([0])
while q:
room = q.popleft()
for key in rooms[room]:
if not unlocked[key]:
unlocked[key] = True
q.append(key)
return all(unlocked)
DFS, recursive
class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
visited = set()
def dfs(room):
visited.add(room)
for key in rooms[room]:
if key not in visited:
dfs(key)
dfs(0)
return len(visited) == len(rooms)
DFS, stack
class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
visited = set()
stack = [0]
while stack:
room = stack.pop()
if room not in visited:
visited.add(room)
stack.extend(rooms[room])
return len(visited) == len(rooms)