一:深度优先搜索
示例1
题目链接:886. 可能的二分法 - 力扣(LeetCode)
首先可以构建一个图的邻接表表示,然后使用深度优先搜索(DFS)算法来检查图是否可以二分。如果图可以二分,则返回 True;否则返回 False。具体步骤如下:
- 构建图:使用一个列表
graph
来存储每个节点的邻接节点。- 初始化颜色数组:使用一个数组
color
来记录每个节点的颜色,-1 表示未着色。- DFS 检查:定义一个 DFS 函数,递归地为每个节点着色,并检查其相邻节点的颜色是否满足二分条件。
- 遍历所有节点:确保每个节点都被检查,如果发现未着色的节点,则从该节点开始进行 DFS 检查。
- 返回结果:如果所有节点都满足二分条件,则返回 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