深度优先搜索与并查集

一:深度优先搜索

示例1

题目链接:886. 可能的二分法 - 力扣(LeetCode)

首先可以构建一个图的邻接表表示,然后使用深度优先搜索(DFS)算法来检查图是否可以二分。如果图可以二分,则返回 True;否则返回 False。具体步骤如下:

  1. 构建图:使用一个列表 graph 来存储每个节点的邻接节点。
  2. 初始化颜色数组:使用一个数组 color 来记录每个节点的颜色,-1 表示未着色。
  3. DFS 检查:定义一个 DFS 函数,递归地为每个节点着色,并检查其相邻节点的颜色是否满足二分条件。
  4. 遍历所有节点:确保每个节点都被检查,如果发现未着色的节点,则从该节点开始进行 DFS 检查。
  5. 返回结果:如果所有节点都满足二分条件,则返回 True;否则返回 False。
def possibleBipartition(n, dislikes):
    # 创建一个大小为 n+1 的列表,用于存储图中的每个节点及其相邻节点
    graph = [[] for _ in range(n + 1)]
    
    # 遍历 dislikes 列表,构建图的邻接表表示
    for u, v in dislikes:
        graph[u].append(v)  # 添加 v 到 u 的邻接列表
        graph[v].append(u)  # 添加 u 到 v 的邻接列表

    # 初始化颜色数组,-1 表示节点尚未着色
    color = [-1] * (n + 1) 

    # 定义深度优先搜索(DFS)函数,用于检查图是否可以二分
    def dfs(node, c):
        # 将当前节点着色为 c(0 或 1)
        color[node] = c
     
        # 遍历当前节点的所有相邻节点
        for neighbor in graph[node]:
            # 如果相邻节点未着色,则递归调用 dfs 着色为 1-c
            if color[neighbor] == -1:
                if not dfs(neighbor, 1 - c):
                    return False
            # 如果相邻节点已着色且颜色与当前节点相同,则图不是二分的
            elif color[neighbor] == c:
                return False
        # 如果所有相邻节点都满足条件,返回 True
        return Tru
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值