LeetCode 785. 判断二分图

本文介绍了一种基于深度优先搜索的二分图判定算法。通过将图的节点分为两个独立的子集A和B,确保每条边连接的节点分别属于不同的子集,从而判断一个图是否为二分图。该算法利用颜色标记来区分节点所属的子集,并使用堆栈进行遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个无向图graph,当这个图为二分图时返回true

如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。

graph将会以邻接表方式给出graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。

# 类似染色问题
class Solution:
    def isBipartite(self, graph: List[List[int]]) -> bool:
        color = {}
        for node in range(len(graph)): # 一个一个的试 graph中的结点
            if node not in color:
                color[node] = 1
                stack = [node]
            while stack:
                node = stack.pop()
                for neighbor in graph[node]: # 因为没有环和平行边所以和node相邻的结点必须和node颜色不同
                    if neighbor not in color:  
                        color[neighbor] = -color[node]
                        stack.append(neighbor)  # 把一个未染色的结点染上色后,还要判断这里染这种色可不可以
                    else:
                        if color[neighbor] == color[node]: # 如果和旁边的node颜色相同,就False
                            return False  
        return True      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值