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)