886. Possible Bipartition
Đề 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 <= 20000 <= dislikes.length <= 104dislikes[i].length == 21 <= dislikes[i][j] <= nai < bi- All the pairs of
dislikesare unique.
Thuật Toán & Kỹ Thuật
⏱️ 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