classSolution: defpossibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool: iflen(dislikes)==0:returnTrue result = [] #记录每种组合是否可以分开两组 defget_next_child(x):# 获取当前组合情况下的下一种组合方式 iflen(x['red'])==0: return [dislikes[0],dislikes[0][::-1]] i=sorted([x['red'][-1],x['blue'][-1]]) nextidx = dislikes.index(i)+1 if nextidx==len(dislikes):return [] else: return [dislikes[nextidx],dislikes[nextidx][::-1]] defdfs(x): #dfs遍历 iflen(x['red'])!=0and ((x['red'][-1] in x['blue'][:-1] and x['blue'][-1] in x['blue'][:-1]) or (x['red'][-1] in x['red'][:-1] and x['blue'][-1] in x['red'][:-1])): result.append(False) return next_chile = get_next_child(x) if next_chile==[]: iflen(set(x['red'])&set(x['blue']))>0: result.append(False) else:result.append(True)#如果有一种成功的组合则返回true return for i in next_chile: dfs({'red':x['red']+[i[0]],'blue':x['blue']+[i[1]]}) dfs({'red':[],'blue':[]}) returnFalseifsum(result)==0elseTrue
p=list(range(2*n+1)) deffind(x): if p[x] != x: p[x] = find(p[x]) return p[x] for a,b in dislikes: a = find(a) b = find(b) if a==b:returnFalse p[find(a+n)] = b p[find(b+n)] = a returnTrue