886. Possible Bipartition

Medium (Trung bình) Python 🔗 Xem trên LeetCode

📋 Đề Bài

We want to split a group of n people (labeled from 1 to n) into two groups of any size. Each person may dislike some other people, and they should not go into the same group.

Given the integer n and the array dislikes where dislikes[i] = [ai, bi] indicates that the person labeled ai does not like the person labeled bi, return true if it is possible to split everyone into two groups in this way.

 

Example 1:

Input: n = 4, dislikes = [[1,2],[1,3],[2,4]]
Output: true
Explanation: group1 [1,4] and group2 [2,3].

Example 2:

Input: n = 3, dislikes = [[1,2],[1,3],[2,3]]
Output: false

Example 3:

Input: n = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
Output: false

 

Constraints:

  • 1 <= n <= 2000
  • 0 <= dislikes.length <= 104
  • dislikes[i].length == 2
  • 1 <= dislikes[i][j] <= n
  • ai < bi
  • All the pairs of dislikes are unique.

🧠 Thuật Toán & Kỹ Thuật

DFS (Tìm kiếm theo chiều sâu)Graph (Đồ thị)
⏱️ Thời gian O(V+E)
💾 Không gian O(V)

💻 Lời Giải

Python 0886-possible-bipartition.py
class Solution:
    def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
        adj = [[] for _ in range(n + 1)]
        
        for u, v in dislikes:
            adj[u].append(v)
            adj[v].append(u)
            
        color = [0 for _ in range(n + 1)]
        
        def dfs(u, tincture):
            if color[u] != 0:
                return color[u] == tincture
            color[u] = tincture
            for v in adj[u]:
                if not dfs(v, -tincture):
                    return False
            return True
            
        for u in range(1, n + 1):
            if not color[u] and not dfs(u, 1):
                return False
        
        return True