给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。
每个人都可能不喜欢其他人,那么他们不应该属于同一组。
形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。
当可以用这种方法将所有人分进两组时,返回 true;否则返回 false。
染色法
from typing import *
from collections import defaultdict
class Solution:
def __init__(self):
self.colors = None
self.graph = defaultdict(lambda: [])
self.flag = True
def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:
self.colors = [0] * (N+1)
for dislike in dislikes:
self.graph[dislike[0]].append(dislike[1])
self.graph[dislike[1]].append(dislike[0])
for i in range(1,N+1):
if not self.flag:
return False
if self.colors[i]==0:
self.dfs(i, 1)
return True
def dfs(self, i, c):
if not self.flag:
return
self.colors[i] = c
for j in self.graph[i]:
if self.colors[j] == c:
self.flag = False
elif self.colors[j] == 0:
self.dfs(j, -c)