给定一个无向图graph
,当这个图为二分图时返回true
。
如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。
graph
将会以邻接表方式给出,graph[i]
表示图中与节点i
相连的所有节点。每个节点都是一个在0
到graph.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