深度优先搜索DFS | 广度优先搜索BFS:力扣886. 可能的二分法

1、题目描述:

在这里插入图片描述
在这里插入图片描述

2、题解:

方法1:DFS
相当于判断是否可以构成二分图。具体思路可以参考:深度优先搜索DFS | 广度优先搜索BFS | 并查集:力扣785. 判断二分图
要注意:先把dislikes转化为邻接表

class Solution:
    def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:
        # 深度优先搜索
        # 转化为邻接矩阵
        graph = [[] for _ in range(N + 1)]
        for u, v in dislikes:
            graph[u].append(v)
            graph[v].append(u)
        # print(graph)
        n = N + 1
        UNCOLORED, RED, GREEN = 0, 1, 2
        color = [UNCOLORED] * n
        valid = True

        def dfs(node: int, c: int):
            nonlocal valid
            color[node] = c
            cNei = (GREEN if c == RED else RED)
            for neighbor in graph[node]:
                if color[neighbor] == UNCOLORED:
                    dfs(neighbor, cNei)
                    if not valid:
                        return
                elif color[neighbor] != cNei:
                    valid = False
                    return

        for i in range(n):
            if color[i] == UNCOLORED:
                dfs(i, RED)
                if not valid:
                    break

        return valid

方法2:广度优先搜索BFS
要注意:先把dislikes转化为邻接表.可以试着把dislikes转化成字典(也就是哈希映射)

class Solution:
    def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:
        # 广度优先搜索
        # 转化为邻接矩阵
        graph = [[] for _ in range(N + 1)]
        for u, v in dislikes:
            graph[u].append(v)
            graph[v].append(u)
        n = N + 1
        uncolored, red, green = 0, 1, 2
        color = [uncolored] * n
        for i in range(n):
            if color[i] == uncolored:
                queue = collections.deque([i])
                color[i] = red
                while queue:
                    node = queue.popleft()
                    cNei = (green if color[node] == red else red)
                    for neighbor in graph[node]:
                        if color[neighbor] == uncolored:
                            queue.append(neighbor)
                            color[neighbor] = cNei
                        elif color[neighbor] != cNei:
                            return False
        return True

3、复杂度分析:

时间复杂度:O(N+E),其中E为dislikes的长度
空间复杂度:O(N+E)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值