钥匙和房间-图论841-python

没看答案。
图论的广度优先搜索(BFS),类似树结构的BFS,都是利用队列实现的。

class Solution:
    def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
        n = len(rooms)
        visited = [True] + [False] * (n-1) # 用于判断某个房间在之前是否已经访问过,防止死循环
        queue = [i for i in rooms[0]]

        while queue:
            for _ in range(len(queue)):
                key = queue[0]
                queue.pop(0)

                if not visited[key]:
                    visited[key] = True # 进入(访问)该房间

                    for k in rooms[key]: # 拿走房间中所有未访问房间的钥匙
                        if not visited[k]:
                            queue.append(k)

        # 若存在未被访问的房间,则False,否则为True
        for flag in visited:
            if not flag:
                return False
        else:
            return True

图论的深度优先搜索(DFS),类似树结构的DFS,利用递归实现(也可以用栈实现)。

class Solution:
    def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
        n = len(rooms)
        visited = [True] + [False] * (n-1) # 用于判断某个房间在之前是否已经访问过,防止死循环
        
        def dfs(keys): 
            for key in keys: # 拿走房间中所有未访问房间的钥匙
                if not visited[key]:
                    visited[key] = True # 进入(访问)该房间
                    dfs(rooms[key])
        
        dfs(rooms[0])
            
        # 若存在未被访问的房间,则False,否则为True
        for flag in visited:
            if not flag:
                return False
        else:
            return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值