886.可能的二分法

https://leetcode-cn.com/problems/possible-bipartition/

一、二分图

将dislikes数组理解为边,人理解为两端的顶点,问题转化为求是否存在二分图

class Solution:
    def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
        self.flag = True
        visited = [False] * (n+1)
        color = [False] * (n+1)
        graph = {}
        for i in range(1, n+1):
            graph[i] = list()
        # 通过边构建邻接表
        for edge in dislikes:
            f = edge[0]
            t = edge[1]
            # 无向图也是双向图
            graph[f].append(t)
            graph[t].append(f)

        def dfs(v):
            if not self.flag:
                return
            visited[v] = True
            for j in graph[v]:
                if not visited[j]:
                    color[j] = not color[v]
                    dfs(j)
                else:
                    if color[j] == color[v]:
                        self.flag = False

        for i in range(1, n+1):
            if not visited[i]:
                dfs(i)
        return self.flag

最后更新于